0

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

4

3 回答 3

1

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

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

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

于 2013-02-08T11:04:39.903 回答
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

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

于 2013-02-08T11:03:48.120 回答
0

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

@interface ClassA ()
{
    __weak id _delegate;
}
@end
于 2013-02-08T11:10:02.070 回答