错误的代表声明

时间:2013-02-08 10:59:09

标签: iphone ios xcode delegates

让我们假设我有一个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声明默认为弱?

3 个答案:

答案 0 :(得分:1)

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

否则,正如您已经知道的那样,您可能会面临代表保留周期的风险。

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

答案 1 :(得分:0)

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

@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

默认情况下,您的实例变量很强。

答案 2 :(得分:0)

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

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