Objective c 使用ARC时访问合成属性

Objective c 使用ARC时访问合成属性,objective-c,ios,automatic-ref-counting,Objective C,Ios,Automatic Ref Counting,当我将合成声明为如下属性时: @syntesize myObject = _myObject; 我可以在代码中直接访问myObject,同时避免使用合成的getter和setter 但是,如果我合成这样的性质 @syntesize myObject = myObject; 我将不能再访问隐藏在=myObject后面的实例变量了吗?我应该优先使用其中一种还是另一种。因为我在使用\u myObject而不是self.myObject时经常遇到“BAD\u ACCESS-问题”。在这两种情况下,

当我将合成声明为如下属性时:

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

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

 @syntesize myObject = myObject;

我将不能再访问隐藏在
=myObject
后面的实例变量了吗?我应该优先使用其中一种还是另一种。因为我在使用
\u myObject
而不是
self.myObject
时经常遇到“
BAD\u ACCESS
-问题”。在这两种情况下,您都可以访问基础ivar。在这两种情况下,你都应该避免这样做。在除init、dealloc和访问器本身之外的任何地方使用访问器。无论有无ARC,这将避免许多头痛

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

  • 不正确地使用
    \u桥
  • 使用
    assign
    \u unsafe\u unretained
    不安全地

在这两种情况下,您都可以访问基础ivar。在这两种情况下,你都应该避免这样做。在除init、dealloc和访问器本身之外的任何地方使用访问器。无论有无ARC,这将避免许多头痛

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

  • 不正确地使用
    \u桥
  • 使用
    assign
    \u unsafe\u unretained
    不安全地

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

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

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


以上所说的,我认为只在访问器方法实现中直接访问IVAR,以及<代码> init < /C> >(和<代码> DELOLC/<代码>如果不使用ARC),

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


以上所说的,我认为只在访问器方法实现中直接访问IVAR,连同<代码> init <代码>(和<代码> DELOLC/<代码>如果不使用ARC)是不错的做法。< /P> + 1和声明的属性也是访问器。贝西,您的代码只使用点语法(

self.myObject
)或显式(
[self-myObject]
[self-setMyObject:…])的访问器。因此,声明的属性不会隐藏或与实例变量名冲突。在任何给定的表达式中使用哪一个都没有歧义。+1和:声明的属性是访问器@贝西,您的代码只使用点语法(
self.myObject
)或显式(
[self-myObject]
[self-setMyObject:…])的访问器。因此,声明的属性不会隐藏或与实例变量名冲突。在任何给定的表达式中使用哪一个都没有歧义。我不确定这是不是真的。假设您有一个
strong
属性,并且在不使用
self.myObject
而使用_myObject的情况下设置了一个对象,则不会保留该对象,因为未调用合成的“retain accessor”。因此,在执行此操作时,我可能会获得
EXEC\u BAD\u访问权限
。你知道我的意思吗?只要你让编译器通过不显式声明来合成实例变量*,如果你的@property是用
strong
声明的,那么合成的
\u myObject
ivar将有一个所有权限定符
\u strong
,编译器将插入一个retain(以及先前值的释放)为变量赋值。这在LLVM ARC文档的第4.1.1节中有详细说明:*(如果明确声明ivar,其所有权必须与@property声明中指定的所有权匹配)我不知道任何现有实例变量都具有与之关联的相同所有权规则。感谢您的宝贵见解!我不确定这是否正确。假设您拥有
strong
属性,并且在不使用
self.myObject
而使用_myObject的情况下设置了一个对象,则此对象不会保留为beca使用未调用的合成“retain accessor”。因此,在执行此操作时,我可能会获得
EXEC\u BAD\u ACCESS
。是否