使用ARC时访问合成属性

时间:2012-05-02 14:09:26

标签: objective-c ios automatic-ref-counting

当我宣布合成这样的属性时:

@syntesize myObject = _myObject;

我可以直接在代码中访问_myObject,同时避免使用合成的getter和setter。

但是,如果我合成这样的属性

 @syntesize myObject = myObject;

我将无法再访问隐藏在= myObject后面的实例变量吗?我应该优先使用其中一个。因为在使用BAD_ACCESS代替_myObject时,我经常遇到“self.myObject - 问题”。

3 个答案:

答案 0 :(得分:3)

在这两种情况下,您都可以访问底层的ivar。在这两种情况下,你应该避免这样做。除了init,dealloc和访问器本身之外,在任何地方都使用访问器。无论是否有ARC,这都可以避免许多麻烦。

也就是说,如果您在ARC下访问ivar时获得EXC_BAD_ACCESS,您可能正在执行以下操作之一:

  • 错误地使用__bridge
  • 使用assign__unsafe_unretained不安全

答案 1 :(得分:1)

如果创建属性,则应使用属性访问器并避免直接使用实例变量。唯一的例外是您的-init-dealloc方法,在大多数情况下,也可以在那里使用访问者。不要避开访问者,使用

答案 2 :(得分:1)

使用_myObject本身不应导致内存管理问题。原因几乎肯定存在于其他地方,或者比简单地使用下划线前缀的ivar名称更加微妙。无论如何,如果您将ivar命名为与属性相同的名称,您仍然可以像往常一样使用其名称来访问实例变量。只有当您通过访问者方法(例如使用self.myObject[self myObject])访问它时,您才能直接访问ivar。您也可以使用self->myObject访问它,这相当于myObject

所有这一切,我认为仅在访问者方法实现本身内部直接访问ivars以及init(如果不使用ARC,则为dealloc)也是一种好习惯。