【问题标题】:What qualifier should I use to declare a block as an ivar?我应该使用什么限定符将块声明为 ivar?
【发布时间】:2012-04-25 02:13:43
【问题描述】:

例子:

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

我应该在 [??] 括号中添加什么限定词?

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

我在 ios5 上使用 ARC。

【问题讨论】:

    标签: objective-c objective-c-blocks


    【解决方案1】:

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

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

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

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

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

    @implementation MyClass
    {
        responseBlock responseHandler;
    }
    
    // Continue with implementation as usual
    

    【讨论】:

    • 太好了,这为我解决了很多问题。感谢您对在实施中声明 ivars 的新推荐做法的详细回复和呼吁。
    猜你喜欢
    • 1970-01-01
    • 2023-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-13
    • 2017-12-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多