我应该使用什么限定符来声明块作为ivar?

Ral*_*veo 1 objective-c objective-c-blocks

例:

typedef void(^responseBlock)(NSDictionary*, NSError *);
@interface MyClass : NSObject
{
    [??] responseBlock responseHandler;
}

我应该在[??]括号中放置什么限定词?

我已经读过作为属性的块应该使用复制限定符设置...但是在这种情况下我不需要将块暴露为属性.我只是希望它仍然是一个ivar但我怎么能指定副本?而且,没有指定什么是使用的默认限定符?是__strong和其他一切一样吗?

我在ios5上使用ARC.

Jos*_*ell 5

是的,块是ObjC中的对象,__strong适当的限定符也是如此.由于这是默认设置,您实际上可以将其关闭.

你没有办法指定在没有属性的情况下复制Block - 这将是你的责任(responseHandler = [someBlock copy];).您可以通过在.m文件中放置类扩展来声明一个仅对此类本身可见的属性(不可用于其他代码):

@interface MyClass ()
@property (copy) responseBlock responseHandler;
@end
Run Code Online (Sandbox Code Playgroud)

这(在合成时)将为您提供通常的访问方法,在您使用它们时将为您处理副本.

还要注意,在块中声明实例变量是可能的(现在推荐的过程)@implementation.听起来你希望这是一个私有属性(没有属性访问),并且在那里声明的ivars不能被任何其他代码看到.(当然,如果您正在使用房产,@synthesize则不需要这样做; 将为您创建ivar.)

@implementation MyClass
{
    responseBlock responseHandler;
}

// Continue with implementation as usual
Run Code Online (Sandbox Code Playgroud)