我的英语不好,我试着清楚地描述问题。
我知道@property
和@synthesize
只是获取getter和setter方法。因此,我们可以self.x
和_x
使用属性。
而self.x
只是调用setter和getter方法。
@ property(strong)
的结果是get方法如下:
一切都在ARC:
@property (nonatomic, strong) NSString *name;
- (NSString *)name {
return _name;
}
- (void)setName:(NSString *)name {
if (_name != name) {
_name = name;
}
}
所以,我的问题是,如果使用@property(strong)
只是为了获取方法,我们可以使用以下内容。
- (void)setName:(NSString *)name {
if (_name != name) {
__weak _name = name;
}
}
当我们使用self.name
来设置setName:
方法调用,并且我们得到一个弱名称,即使我们之前使用强,它看起来也是正确的。但还有其他一些例子。
@protocol TestDelegate <NSObject>
@end
@interface Test : UIView
@property (nonatomic, weak) id<TestDelegate> delegate;
- (instancetype)initWithDelegate:(id<TestDelegate>)delegate;
@end
- (instancetype)initWithDelegate:(id<TestDelegate>)delegate {
self = [super init];
if (self) {
_delegate = delegate;
}
return self;
}
在 ViewController 中使用,所有 dealloc ,无回收。然后我们使用
@property (nonatomic, strong) id<TestDelegate> delegate;
- (instancetype)initWithDelegate:(id<TestDelegate>)delegate {
self = [super init];
if (self) {
self.delegate = delegate;
}
return self;
}
- (void)setDelegate:(id<TestDelegate>)delegate {
__weak _delegate = delegate;
}
所有都是dealloc,也没有回收。因为我们在init方法中使用self.delegate
,setDelegate:
方法调用我们得到弱委托,即使我们之前使用强。然后我们使用_delegate = delegate
,它会回收!!!
我很困惑,我们使用weak
和_delegate = delegate
,它运行良好,但我们使用strong
,_delegate = delegate
和自定义弱集方法,它是循环使用。
谢谢!
答案 0 :(得分:0)
代表必须是弱类型的属性。这将避免保留周期,因为可以在它们之间保留两个物体的无限循环。使用ARC时,这是使用委托的示例:@property (nonatomic, weak) id <MyObjectDelegate> delegate;