我今天了解到,在编写自己的getter / setter方法时,isars不会在getter中自动合成: property not working with getter AND setter
为了解决这个问题,我只是将我的属性设置为nonatomic
然后只编写了setter--这使我可以避免编写@synthesize property = _property
我知道nonatomic
属性的主要目的是让系统可以更快地读/写属性,因为它在编写时不会涉及锁定属性
但作为副作用(看起来像),你不必同时写一个二传手和吸气剂。
这不好吗?我不确定是否还有其他缺点我没有看到
编辑:为了清晰起见,添加代码:
实施
@interface GalleryManager ()
{
NSObject<GalleryManagerDelegateProtocol>* _delegate;
}
...
-(NSObject<GalleryManagerDelegateProtocol>*)delegate
{
return _delegate;
}
-(void)setDelegate:(NSObject<GalleryManagerDelegateProtocol> *)delegate
{
[self stopObservingDelegate];
_delegate = delegate;
[self startObservingDelegate];
if ( delegate && self.didWakeFromNib )
{
[self setupDefaults];
[self readGalleryFromDisk];
}
}
标题
@property (weak, nonatomic) NSObject<GalleryManagerDelegateProtocol> *delegate;
我想删除扩展程序(_delegate
)中定义的实例变量,除了我认为没有必要之外没有其他理由
但是通过这样做,-delegate
getter方法崩溃了,无法识别_delegate
。因为我在标题中有@property
,我认为_delegate
ivar会自动合成,但我发现它只能在setter中识别。
因此,在我开始时提到的SO问题中,答案是在实施开始时添加@synthesize delegate = delegate
但我只想将标题中的@property
更改为nonatomic
,然后直接删除-delegate
getter方法
同样,除了尽可能干净之外别无其他理由