0

当我声明合成一个这样的属性时:

@syntesize myObject = _myObject;

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

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

 @syntesize myObject = myObject;

我将不再能够访问隐藏在后面的实例变量= myObject吗?我是否应该偏好使用其中一种。因为我BAD_ACCESS在使用_myObject而不是self.myObject.

4

3 回答 3

3

在这两种情况下,您都可以访问底层 ivar。在这两种情况下,您都应该避免这样做。除了 init、dealloc 和访问器本身之外,在任何地方都使用访问器。这将避免许多令人头疼的问题,无论有没有 ARC。

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

  • 不正确的使用__bridge
  • 使用assign__unsafe_unretained不安全
于 2012-05-02T14:14:39.007 回答
1

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

于 2012-05-02T14:15:09.510 回答
1

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

综上所述,我认为仅在访问器方法实现本身内部直接访问 ivars 以及initdealloc如果不使用 ARC)是一种很好的做法。

于 2012-05-02T14:15:46.090 回答