gpt4 book ai didi

iphone - 为什么要在 init 方法中调用 autorelease 来定义 iVar?

转载 作者:行者123 更新时间:2023-12-03 20:26:46 24 4
gpt4 key购买 nike

我刚刚熟悉了 CLLocationManager,发现了几个包含以下 init 方法的示例类定义:

- (id) init {
self = [super init];

if (self != nil) {
self.locationManager = [[[CLLocationManager alloc] init] autorelease];
self.locationManager.delegate = self;
}
return self;
}

- (void)dealloc {
[self.locationManager release];
[super dealloc];
}

我不明白为什么 iVar 会自动释放。这是否意味着它在 init 方法结束时被释放?

我也很困惑地​​看到相同的示例代码在 dealloc 方法中释放了 iVar。

有什么想法吗?'

最佳答案

locationManager 是一个可能使用 retain 属性设置的属性。

基本上,如果你只写:

self.locationManager = [[CLLocationManager alloc] init];

左侧的 self.locationManager setter 保留对已分配的 CLLocationManager 的引用。但右侧的 CLLocationManager 引用本身从未被释放。该管理器的保留计数永远不会为零,并且该对象永远不会消失——这会导致内存泄漏。

有两种方法可以解决这个问题。 autorelease 分配的对象,如您在引用的代码片段中看到的那样 - 或者将分配的对象分配给临时变量,将临时变量保留到 locationManager 属性,然后显式释放临时变量:

CLLocationManager *_temporaryReference = [[CLLocationManager alloc] init];
self.locationManager = _temporaryReference; // this is retained
[_temporaryReference release];

在内存管理方面,这两种方法是等效的。有些人更喜欢第二种方法,因为他们不喜欢等待自动释放池被“清空”,特别是在像 iPhone 这样的低内存设备上,这提供了对对象生命周期的更严格的控制。

苹果的Objective-C Programming Language文档更详细地解释了此属性。

关于iphone - 为什么要在 init 方法中调用 autorelease 来定义 iVar?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2743511/

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