2011-02-03 62 views
5

任何人都可以解釋設置someObject = someOtherObject;self.someObject = someOtherObject;之間的區別,如果someObject是使用@property(nonatomic,retain)創建的類屬性SomeType someObject;何時訪問屬性和自己什麼時候?

爲了澄清我有類似:

@interface SomeClass : NSObject { 
    SomeType* someObject; 
} 

@property (nonatomic, retain) SomeType* someObject; 

@end 

我已經注意到,我得到EXC_BAD ACCESS有時當我使用沒有自我的財產,它似乎很隨意。當我使用自己的時候,我的程序就像它應該那樣行事。當我跳過自我時,我沒有收到任何編譯器錯誤或警告,所以我猜它是某種有效的語法?

+0

[我應該何時應該使用self關鍵字。](http://stackoverflow.com/questions/4080523/when-should-i-use-the-self-keyword)可能有重複,你在問這個問題之前搜索? – zoul 2011-02-03 09:34:27

回答

2

屬性只是一種訪問數據的便捷方式。所以當你聲明屬性@property(nonatomic,retain)SomeType * someObject;這意味着訪問期間,存在將被合成的2種方法:

吸氣劑:

-(SomeType*) someObject { 
    return someObject; 
} 

設定器

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

所以特性和實例變量之間的主要區別在於,屬性動態地創建的setter /吸氣劑方法(你可以覆蓋它們)。但是當你寫someObject = new_val時,你只是將引用複製到內存位置。除了一個彙編指令外,沒有額外的工作完成。

還有一件事要提到:原子和非原子。 對於原子,合成的setter/getter將確保整個值總是從getter返回或由setter設置,而不管任何其他線程上的setter活動。也就是說,如果線程A位於獲取者的中間,而線程B調用setter,則實際可行值(最有可能的自動釋放對象)將返回給調用者A.

在非原子中,沒有這樣的保證。因此,非原子比原子快得多。

編輯:如果你有一些變量,可以從不同的線程訪問或/和一些額外的工作必須完成(例如保留,提高一些標誌......),那麼你的選擇是財產。但是有時你有一個變量,經常訪問,通過屬性訪問可能會導致很大的開銷,因爲處理器必須執行更多的操作來合成和調用方法。

4

self.someObject = someOtherObject使用該屬性。屬性爲你生成setter和getters。在你的情況下,你給屬性retain屬性,這意味着通過此屬性設置的對象將自動收到一條retain消息,它將其保留計數增加1.此外,成員變量的舊值將發送release消息這減少了其保留數量。

如果您嘗試訪問解除分配的對象(例如,如果您嘗試釋放它太頻繁),則系統會取消分配其中的Obects。如果您嘗試訪問解除分配的對象,則會獲得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. 
0

兩者之間的區別是:

1)當你不使用 「自我」。您將結果直接分配給成員變量。

2)當你使用「自我」。你正在調用該屬性的setter方法。它與[self setMyObject:...]相同;

所以在self.myobject的情況下,它保留其保留,並在其他情況下,(沒有自己),如果你不使用alloc,那麼它將被視爲自動釋放對象。

在大多數情況下,您會發現要使用「self」,除了在對象初始化期間。

順便問一下,你也可以使用self.someObject = [someOtherObject retain]增加保留櫃檯

1

這是所有關於內存管理。

您的班級資產someObject已在您的.h/.m文件中生成帶註釋@property/@synthsize的訪問者。

當您使用someObject訪問您的房產時,您可以直接訪問該房產。當您訪問self.someObject時,您打電話給您的訪問者[self someObject],爲您處理內存管理。

所以,當你需要分配一個類屬性時,它會更清潔,因爲你使用setter,並且不必關心釋放和保留。當你的製作者使用@property (nonatomic, retain)生成時,所以它會照顧你。

相關問題