什么时候和自己一起访问财产?

任何人都可以解释设置someObject = someOtherObject;self.someObject = someOtherObject; 如果someObject是用@property(nonatomic,retain)创build的类属性SomeType someObject;

澄清我有这样的事情:

 @interface SomeClass : NSObject { SomeType* someObject; } @property (nonatomic, retain) SomeType* someObject; @end 

我注意到,当我使用属性而没有自己的时候,我得到了EXC_BAD ACCESS,而且看起来很随意。 当我使用自己的时候,我的程序就像它应该那样行事。 当我跳过自我,我没有得到任何编译器错误或警告,所以我想这是某种有效的语法?

属性只是访问数据的一种便捷方式。 所以当你声明属性@property(nonatomic,retain)SomeType * someObject; 这意味着在访问期间将会合成2种方法:

吸气:

 -(SomeType*) someObject { return someObject; } 

二传手

 -(void) setSomeObject:(SomeType*) obj { [someObject release]; someObject = [obj retain]; } 

所以属性和ivars之间的主要区别是dynamic创buildsetter / getter方法的属性(并且可以覆盖它们)。 但是当你写someObject = new_val时,你只是将引用复制到内存位置。 除了一个汇编指令外,没有额外的工作完成。

还有一件事要提到:primefaces和非primefaces。 使用primefaces,合成的setter / getter将确保整个值始终从getter返回或由setter设置,而不pipe其他线程上的setter活动。 也就是说,如果线程A位于getter的中间,而线程B调用setter,则实际的可用值 – 最有可能的自动释放对象 – 将在A中返回给调用者。

在非primefaces,没有这样的保证。 因此,非primefaces比primefaces快得多。

编辑:所以如果你有一些variables,这是从不同的线程访问或/和一些额外的工作必须完成(如保留,提高一些标志…),那么你的select是财产。 但是有时你有一个variables,经常访问,通过属性访问会导致很大的开销,因为处理器必须执行更多的操作来合成和调用方法。

self.someObject = someOtherObject使用该属性。 属性为你生成setter和getters。 在你的情况下,你将retain属性赋予了属性,这意味着通过这个属性设置的对象将自动接收一个retain消息,它将保留计数增加1.此外,成员variables的旧值被发送一个release消息这减less了保留数量。

如果您试图访问一个释放对象(例如,如果您尝试释放它太频繁),您将得到一个EXC_BAD_ACCESS ecxeption。

在你的情况下:

 SomeOtherObject *soo = [[SomeOtherObject alloc] init]; //retain count: 1 self.someObject = soo; //soo's retain count is now 2 [soo release]; //soo's retain count is 1 again, as self still uses it. [self doSomethingWithSoo]; 

但是,如果您不使用setter,则不得释放soo

 SomeOtherObject *soo = [[SomeOtherObject alloc] init]; //retain count: 1 someObject = soo; //soo's retain count is still 1 [soo release]; //soo's retain count is 0, it will be deallocated [self doSomethingWithSoo]; //will fail with an EXC_BAD_ACCESS exception, as soo does not exist anymore. 

这全是关于内存pipe理。

您的类属性someObject已经在您的.h / .m文件中生成了带有注解@synthsize / @synthsize器。

当您使用someObject访问您的财产时,您可以直接访问该财产。 当你访问self.someObject你正在调用你的访问器[self someObject]来为你pipe理内存pipe理。

所以当你需要分配一个类属性时,它会更干净的做self.someObject = someOtherObject; 因为你使用二传手,并不需要注意释放和保留。 当你使用@property (nonatomic, retain)生成你的setter时@property (nonatomic, retain)它将会为你保留。

两者的区别是:

1)当你不使用“自我”。 您将结果直接分配给成员variables。

2)当你使用“自我”。 你正在调用该属性的setter方法。 它和[self setMyObject:…]是一样的;

所以在self.myobject的情况下,它保留它的保留,而在其他情况下,(没有自己),如果你不使用alloc,那么它将被视为自动释放对象。

在大多数情况下,你会发现你想使用“自我”,除了在对象的初始化。

顺便说一句,你也可以使用self.someObject = [someOtherObject retain]来增加保留计数器