gpt4 book ai didi

ios - ARC weak ivar 在返回之前发布 - 构建发布时,而不是调试

转载 作者:可可西里 更新时间:2023-11-01 05:03:59 24 4
gpt4 key购买 nike

我有一个延迟创建对象并将其存储为弱属性的类。其他类可能会请求这个对象,但显然必须保持对它的强引用以防止对象被释放:

// .h
@interface ObjectManager
@property(nonatomic, weak, readonly) NSObject *theObject;
@end

// .m
@interface ObjectManager ()
@property(nonatomic, weak, 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 并返回 theObject

当方案设置为发布构建时,theObject 返回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 没有在访问器方法本身中进一步使用,所以 weak 变量被设置为 nil回来之前。似乎我必须在实际返回变量之前创建一个强引用,我只能考虑使用 block 来做,但会很困惑,我宁愿避免它!

是否有某种关键字可以与返回类型一起使用来阻止 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 weak ivar 在返回之前发布 - 构建发布时,而不是调试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15118909/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com