1

例子:

typedef void(^responseBlock)(NSDictionary*, NSError *);
@interface MyClass : NSObject
{
    [??] 响应块响应处理器;
}

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

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

我在 ios5 上使用 ARC。

4

1 回答 1

5

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

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

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

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

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

@implementation MyClass
{
    responseBlock responseHandler;
}

// Continue with implementation as usual
于 2012-04-12T17:26:37.480 回答