我一直在考虑让我的代码减少错误。在清理其他程序员代码时我已经多次看到这种情况,并且我想知道我是否正确地认为在多线程环境中的调用是不安全的:
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 :(得分:1)
我认为你不必担心线程安全问题。让多个线程写入同一属性是一件坏事,应该避免(例如使用锁)。
你可以使用
摆脱自动释放prop1 = [[SomeClass alloc] init];
相反,即不使用该属性。我从不使用autorelease,除非它是必要的,在这种情况下它不是。
答案 1 :(得分:0)
这取决于您的房产类型。如果你将prop1设置为Retain / Copy,那么你应该这样写:
@property (nonatomic, retain) id prop1;
if(self.prop1 == nil)
{
SomeClass *obj = [[SomeClass alloc] init];
self.prop1 = obj;
[obj release];
}
如果将prop1设置为Assign then
@property (nonatomic, assign) id prop1;
if(self.prop1 == nil)
{
SomeClass *obj = [[SomeClass alloc] init];
self.prop1 = [obj retain];
[obj release];
}
在dealloc中,你应该重新启动prop1例如
- (void)dealloc
{
[prop1 release];
[super dealloc];
}
如果您想使用多线程安全玩游戏,可以选择以下选项之一:
1. Make property atomic
2. Use @synchronized over prop1
3. Use Mutex Lock