当我声明合成一个这样的属性时:
@syntesize myObject = _myObject;
我可以_myObject
直接在代码中访问,同时避免合成的 getter 和 setter。
但是,如果我像这样合成属性
@syntesize myObject = myObject;
我将不再能够访问隐藏在后面的实例变量= myObject
吗?我是否应该偏好使用其中一种。因为我BAD_ACCESS
在使用_myObject
而不是self.myObject
.
当我声明合成一个这样的属性时:
@syntesize myObject = _myObject;
我可以_myObject
直接在代码中访问,同时避免合成的 getter 和 setter。
但是,如果我像这样合成属性
@syntesize myObject = myObject;
我将不再能够访问隐藏在后面的实例变量= myObject
吗?我是否应该偏好使用其中一种。因为我BAD_ACCESS
在使用_myObject
而不是self.myObject
.
在这两种情况下,您都可以访问底层 ivar。在这两种情况下,您都应该避免这样做。除了 init、dealloc 和访问器本身之外,在任何地方都使用访问器。这将避免许多令人头疼的问题,无论有没有 ARC。
也就是说,如果您EXC_BAD_ACCESS
在 ARC 下访问 ivar 时遇到问题,您可能正在执行以下操作之一:
__bridge
assign
或__unsafe_unretained
不安全如果您创建一个属性,那么您应该使用属性访问器并避免直接使用实例变量。唯一的例外是在你的-init
and-dealloc
方法中,在大多数情况下也可以在那里使用访问器。不要避开访问器,使用它们。
使用_myObject
本身不应该导致内存管理问题。原因几乎可以肯定在其他地方,或者比简单地使用下划线前缀的 ivar 名称要微妙得多。无论如何,如果您将 ivar 命名为与属性相同的名称,您仍然可以像往常一样仅使用其名称来访问实例变量。只有当您通过访问器方法(例如使用self.myObject
or 或[self myObject]
)访问它时,您才不会直接访问 ivar。您也可以使用 访问它self->myObject
,这相当于 just myObject
。
综上所述,我认为仅在访问器方法实现本身内部直接访问 ivars 以及init
(dealloc
如果不使用 ARC)是一种很好的做法。