objective-c – 属性赋值后跟自动释放
发布时间:2020-12-16 06:56:59 所属栏目:百科 来源:网络整理
导读:我一直在考虑让我的代码减少错误.在清理其他程序员代码时我已经多次看到这种情况,并且我想知道我是否正确地假设多线程环境中的调用不安全: self.prop1 = [[[SomeClass alloc] init] autorelease]; 我的想法是,如果在应用程序完成之前,另一个线程干预并释放p
我一直在考虑让我的代码减少错误.在清理其他程序员代码时我已经多次看到这种情况,并且我想知道我是否正确地假设多线程环境中的调用不安全:
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 我希望这对某人有意义,他们可以澄清或减轻我的担忧. 解决方法
这取决于您的房产类型.如果你将prop1设置为Retain / Copy,那么你应该这样写:
@property (nonatomic,retain) id prop1; if(self.prop1 == nil) { SomeClass *obj = [[SomeClass alloc] init]; self.prop1 = obj; [obj release]; } 如果你将prop1设置为Assign然后 @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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |