ios – 在返回之前发布的ARC弱ivar – 在构建发布时,而不是调试

ios – 在返回之前发布的ARC弱ivar – 在构建发布时,而不是调试,第1张

概述我有一个类懒惰地创建一个对象并将其存储为弱属性.其他类可以请求此对象,但显然必须对其进行强引用以防止对象被释放: // .h@interface ObjectManager@property(nonatomic, weak, readonly) NSObject *theObject;@end// .m@interface ObjectManager ()@property(nona 我有一个类懒惰地创建一个对象并将其存储为弱属性.其他类可以请求此对象,但显然必须对其进行强引用以防止对象被释放:
// .h@interface ObjectManager@property(nonatomic,weak,Readonly) NSObject *theObject;@end// .m@interface ObjectManager ()@property(nonatomic,reaDWrite) NSObject *theObject;@end@implementation ObjectManager- (NSObject *)theObject{    if (!_theObject) {        _theObject = [[NSObject alloc] init];        // Perform further setup of _theObject...    }    return _theObject;}@end

当方案是Xcode被设置为为DeBUG构建时,事情就好了 – 一个对象可以调用objectManagerInstance.theObject并返回对象.

当方案设置为Release版本时,该对象返回nil:

// Build for DeBUG:NSObject *object = objectManagerInstance.theObject;// object is Now pointing to theObject.// Build for Release:NSObject *object = objectManagerInstance.theObject;// object is Now `nil`.

我的猜测是编译器通过在访问器方法本身中没有进一步使用_theObject来优化我的代码,因此在返回之前将弱变量设置为nil.看来我必须在实际返回变量之前创建一个强引用,我只能想用块来做,但是会很乱,我宁愿避免它!

是否有某种关键字我可以使用返回类型来阻止ivar这么快就被填满?

解决方法 最有可能的是,DEBUG构建会导致对象在自动释放池中停留足够长的时间以使其“工作”,而RELEASE构建会使优化器进行更多的控制流分析,从而消除自动释放聊天.

坦率地说,编译器没有在发布版本中发出警告说代码永远无法工作是一个错误(请提交它,因为你有一个很棒的,简洁的例子)!

您需要在对象的某处保持强引用,直到需要强引用才有机会获取引用.

我想知道这样的事情是否有用:

- (NSObject *)theObject{    NSObject *strongObject;    if (!_theObject) {        strongObject = [[NSObject alloc] init];        _theObject = strongObject;        // Perform further setup of _theObject...    } else {        strongObject = _theObject;    }    return strongObject;}

即上面的内容更类似于返回自动释放对象的工厂方法,同时还在内部维护弱引用.但是优化器可能太聪明了一半而且也打破了上述情况.

总结

以上是内存溢出为你收集整理的ios – 在返回之前发布的ARC弱ivar – 在构建发布时,而不是调试全部内容,希望文章能够帮你解决ios – 在返回之前发布的ARC弱ivar – 在构建发布时,而不是调试所遇到的程序开发问题。

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

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

原文地址: http://outofmemory.cn/web/1108858.html

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

发表评论

登录后才能评论

评论列表(0条)

保存