【问题标题】:wrong delegate declaration错误的代表声明
【发布时间】:2013-02-08 10:59:08
【问题描述】:

假设我有一个 ClassA 类

标题:

@interface ClassA : NSObject
- (id)initWithDelegate:(id)delegate;
@end

实现:

@interface ClassA ()
{
    NSObject *_delegate;
}
@end

@implementation
- (id)initWithDelegate:(id)delegate
{
    self = [super init];
    if( self )
    {
        _delegate = delegate;
    }

    return self;
}
@end

由于我跳过了@property 定义,我的委托声明默认为强?所以这段代码是错误的,因为它会导致泄漏,还是我的 delagate 声明默认为weak?

【问题讨论】:

    标签: iphone ios xcode delegates


    【解决方案1】:

    您必须将该 ivar 限定为 __weak。 ivar 的默认值是强的。

    否则,正如您已经知道的那样,您会冒着与代表保持循环的风险。

    顺便说一句,这里的约定是 'id' 而不是 NSObject *。

    【讨论】:

      【解决方案2】:

      最好以明确的方式编写代码:

      @interface ClassA : NSObject
      @property(weak) id delegate; // or @property(weak, readonly)
      @end
      
      @implementation ClassA
      
      - (id)initWithDelegate: (id) delegate
      {
          self = [super init];
          _delegate = delegate;
          return self;
      }
      
      @end
      

      默认情况下,你的实例变量会很强大。

      【讨论】:

        【解决方案3】:

        你是对的,这将导致 ARC 保留 _delegate,即做一个“强”引用。如果你想创建一个弱引用而不声明@property,你可以使用

        @interface ClassA ()
        {
            __weak id _delegate;
        }
        @end
        

        【讨论】:

        • 如果您喜欢这个答案,请点赞和/或标记为“正确答案” :-)
        猜你喜欢
        • 2015-02-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-12-26
        • 1970-01-01
        • 1970-01-01
        • 2018-04-07
        • 1970-01-01
        相关资源
        最近更新 更多