ブロックオブジェクト - shirai/SwiftLearning GitHub Wiki

ブロックオブジェクト

概論

目標

  • ブロックについて概念を説明できる

わかったこと

  • ブロックとは一言で言うと、変数に関数(プログラム)を代入できる仕組みのことである
  • ネットワークやユーザー処理が絡む場合、システムに一旦処理を任せた後、その処理がいつ終わるかが定かではない ブロックを利用するとそういった場合に、その処理が終わったタイミングで局所的に処理を記述できる
  • 二つの異なるクラスの異なるオブジェクトが、一つの共通のユーザーインターフェースを使う場合、メソッドをプロトコルで定義して、 それぞれのクラスで継承すると言う複雑な作業を、ブロックを使うことで簡略化できる

実装方法

  • 引数、戻り値ともになし void(^block)(void) = ^(void){ 処理 }; block(); //実行

  • 引数、戻り値あり int(^block)(id, int) = ^(id str, int c){ 処理 return 戻り値 }; int x = block(str2, c2); //実行

つぎにやること

■「最新iOSプログラミング徹底解説」p43~60読み込み ■学習まとめ作成

ARCでの利用

目標

  • ARCで利用するときの危険性を説明できる

わかったこと

  • ブロックの中で、ブロック生成しているオブジェクトをselfで参照すると、循環参照になり、Xcode上で警告が出る ブロック内でのオブジェクトの参照は、ブロック内でstrongな参照で保持される。 つまり、selfがあると、selfをstrongで参照することになる。 この時、ブロックへの参照がstrongであると循環参照になる。

サンプルプログラム

  • 循環参照 @interface SampleBlock

@property(strong, nonatomic) void(^block)(void); @property(strong, nonatomic) NSString *sample;

@end @implementation SampleBlock

-(void)test{ self.block = ^{ [self doSomething] //ここで警告が出る }; }

-(void)doSomething{ NSLog(@"hello"); }

  • 修正版 @interface SampleBlock

@property(strong, nonatomic) void(^block)(void); @property(strong, nonatomic) NSString *sample; @property(nonatomic) int a;

@end

@implementation SampleBlock

-(void)test{ SampleBlock * __weak weakSelf = self; self.block = ^{ [weakSelf doSomething]; weakSelf.a = 0; weakSelf.sample = @"Test"; }; }

-(void)doSomething{ NSLog(@"%d",self.a); }

わからなかったこと

つぎにやること

__block修飾子

目標

  • __block修飾子を説明できる

わかったこと

  • __block修飾子をつけて宣言したインスタンス変数は、block内で代入が行える 修飾子をつけなければならない理由としては、メソッドが、他のメソッドの中で宣言されたインスタンス変数を参照できないのと同じ原理
  • 参照のみの場合は特に必要がない

実装方法

__block int b = 100; int c = 200; void(^block)(void) = ^(void){ b = b + c //__block修飾子があるため代入できる // c = c + b ←__block修飾子がないためこれは実行できない }; block(); NSLog(@"%d",b); // 300と表示される

つぎにやること

■「最新iOSプログラミング徹底解説」p46読み込み ■学習まとめ作成