示例:
typedef void(^responseBlock)(NSDictionary*, NSError *); @interface MyClass : NSObject { [??] responseBlock responseHandler; }
我应该在[??]括号中放置什么限定符?
我已经读过作为属性的块应该使用复制限定符设置...但是在这种情况下我不需要将块作为属性公开。我只是希望它仍然是一个ivar但我怎么能指定副本?而且,没有指定什么是使用的默认限定符?是否__strong与其他所有情况一样?
我在ios5上使用ARC。
答案 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