将属性设置为非原子而不是合成ivar是不好的做法

时间:2015-09-22 15:31:24

标签: objective-c properties

我今天了解到,在编写自己的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方法

同样,除了尽可能干净之外别无其他理由

0 个答案:

没有答案