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