2011-07-18 39 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,在这种情况下它不是。