当我宣布合成这样的属性时:
@syntesize myObject = _myObject;
我可以直接在代码中访问_myObject
,同时避免使用合成的getter和setter。
但是,如果我合成这样的属性
@syntesize myObject = myObject;
我将无法再访问隐藏在= myObject
后面的实例变量吗?我应该优先使用其中一个。因为在使用BAD_ACCESS
代替_myObject
时,我经常遇到“self.myObject
- 问题”。
答案 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
)也是一种好习惯。