objective-c – 属性赋值后跟自动释放

objective-c – 属性赋值后跟自动释放,第1张

概述我一直在考虑让我的代码减少错误.在清理其他程序员代码时我已经多次看到这种情况,并且我想知道我是否正确地假设多线程环境中的调用不安全: self.prop1 = [[[SomeClass alloc] init] autorelease]; 我的想法是,如果在应用程序完成之前,另一个线程干预并释放prop1,那么在下一个runLoop时,如果prop1未被另一个线程设置为nil,那么init’d的指 我一直在考虑让我的代码减少错误.在清理其他程序员代码时我已经多次看到这种情况,并且我想知道我是否正确地假设多线程环境中的调用不安全:

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 atomic2. Use @synchronized over prop13. Use Mutex Lock
总结

以上是内存溢出为你收集整理的objective-c – 属性赋值后跟自动释放全部内容,希望文章能够帮你解决objective-c – 属性赋值后跟自动释放所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1225617.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存