将引用作为Objective-C中的实例变量阻止

Jac*_*kin 44 objective-c objective-c-blocks

我想知道是否可以将对匿名函数(块)的引用存储为Objective-C中的实例变量.

我知道如何使用委托,目标行动等.我不是在谈论这个.

Dav*_*ong 86

当然.

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];
Run Code Online (Sandbox Code Playgroud)

  • @Jacob是的,你可以这样做:`void(^)(void)`(或者你需要的任何块签名)你看到`MyCustomBlockType`的任何地方.但是,我承诺*使用`typedef`会让事情变得更容易.但是,没有办法说"任何具有任何返回值和任何参数的块.您必须明确签名. (3认同)
  • @Jacob你仍然受到C类型系统的限制.没有"通用"块这样的东西,尽管在C++中你可以用模板和块做一些非常令人费解的事情.更现实的是,类型`id`对于Objective-C类型是通用的,因此获取和返回(可能是nil)`id`会给你很大的灵活性. (3认同)
  • 只是回答Jacob提出的EXPLICIT问题:@property(nonatomic,copy)void(^ userObject)(); (2认同)

Bar*_*ark 12

是的,您当然可以存储对Objective-C块的(副本)的引用.变量声明有点毛茸茸,就像C函数指针一样,但除此之外它没有问题.对于带有id和返回void 的块:

typedef void (^MyActionBlockType)(id);

@interface MyClass : NSObject 
{

}

@property (readwrite,nonatomic,copy) MyActionBlockType myActionBlock;
@end
Run Code Online (Sandbox Code Playgroud)

会做的.

  • 这个定义肯定是毛茸茸的.我很喜欢使用`typedef`来简单地使用.然后你可以做一些疯狂的事情"接受一个块作为参数并返回一个块的块"并且不会在括号中丢失.:) (3认同)