2011-07-18 35 views
4

我一直在考慮讓我的代碼少一些車。清理時,其他程序員的代碼,我想知道如果我在我的假設是正確的我見過很多次,在多線程環境中的呼叫是不是安全:財產分配緊隨着autorelease

self.prop1 = [[[SomeClass alloc] init] autorelease]; 

我的想法是,如果申請前用另一個線程干預並釋放prop1,然後在下一次runLoop時,如果prop1沒有被另一個線程設置爲nil,init'd指針可能會再次被釋放。

Timeline: 

*-----------------**-----------* 
|     |   | 
|     |   Thread 1 autoreleases prop1 when done with function 
|     | 
|     Thread 2 releases prop1 
| 
Thread 1 calls the above code and doesn't finish the function 

我希望這對某人有意義,他們可以澄清或減輕我的擔憂。

+0

「自動釋放」實際上並沒有釋放對象,它只是告訴引用計數系統在稍後的某個時間點減少該對象的引用計數。 – JAB

回答

0

這取決於你的房產類型。如果設置爲prop1作爲保留/複製那麼你應該這樣寫:

@property (nonatomic, retain) id prop1; 

if(self.prop1 == nil) 
{ 
    SomeClass *obj = [[SomeClass alloc] init]; 
    self.prop1 = obj; 
    [obj release]; 
} 

如果設置爲prop1的分配則

@property (nonatomic, assign) id prop1; 
if(self.prop1 == nil) 
{ 
    SomeClass *obj = [[SomeClass alloc] init]; 
    self.prop1 = [obj retain]; 
    [obj release]; 
} 

在dealloc的,你應該例如RELASE的PROP1

- (void)dealloc 
{ 
    [prop1 release]; 
    [super dealloc]; 
} 

如果你要玩的多線程安全的,您可以選擇以下之一:

1. Make property atomic 
2. Use @synchronized over prop1 
3. Use Mutex Lock 
+0

如果您的財產被分配,意味着您不想保留它。 –

+0

感謝馬克提高格式... – Lightygalaxy

1

我認爲你不必擔心線程的安全性。讓多個線程寫入同一個屬性是一件壞事,應該避免(例如使用鎖)。

你可以擺脫使用

prop1 = [[SomeClass alloc] init]; 

代替,即不使用屬性自動釋放的。除非有必要,否則我從不使用autorelease,在這種情況下它不是。