web-dev-qa-db-ja.com

Objective-Cでインスタンス変数として参照をブロックする

無名関数(ブロック)への参照をObjective-Cのインスタンス変数として格納できるかどうか疑問に思いました。

委任、ターゲットアクションなどの使用方法を知っています。これについては話していません。

44
Jacob Relkin

承知しました。

typedef void(^MyCustomBlockType)(void);

@interface MyCustomObject {
  MyCustomBlockType block;
}
@property (nonatomic, copy) MyCustomBlockType block; //note: this has to be copy, not retain
- (void) executeBlock;
@end

@implementation MyCustomObject
@synthesize block;

- (void) executeBlock {
  if (block != nil) {
    block();
  }
}

- (void) dealloc {
  [block release];
  [super dealloc];
}
@end

//elsewhere:

MyCustomObject * object = [[MyCustomObject alloc] init];
[object setBlock:^{
  NSLog(@"hello, world!");
}];

[object executeBlock];
[object release];
86
Dave DeLong

はい、確かにObjective-Cブロックの(コピー)への参照を保存できます。変数の宣言は、C関数ポインターのように少々複雑ですが、それ以上は問題ありません。 and idを受け取り、voidを返すブロックの場合:

typedef void (^MyActionBlockType)(id);

@interface MyClass : NSObject 
{

}

@property (readwrite,nonatomic,copy) MyActionBlockType myActionBlock;
@end

トリックを行います。

12
Barry Wark