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

时间:2012-04-12 17:19:57

标签: objective-c objective-c-blocks

示例:

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

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

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

我在ios5上使用ARC。

1 个答案:

答案 0 :(得分:5)

是的,块是ObjC中的对象,因此__strong是适当的限定符。由于这是默认设置,因此您可以将其关闭。

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

@interface MyClass ()
@property (copy) responseBlock responseHandler;
@end

这个(在合成时)会给你通常的访问方法,当你使用它们时会为你处理副本。

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

@implementation MyClass
{
    responseBlock responseHandler;
}

// Continue with implementation as usual