2 iphone xcode objective-c core-location cllocationmanager
我只是熟悉了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];
}
Run Code Online (Sandbox Code Playgroud)
我不明白为什么iVar会被自动释放.这是否意味着它在init方法结束时被释放?
我也很困惑地看到相同的示例代码在dealloc方法中有iVar版本.
有什么想法吗?"
这locationManager是一个可能使用该retain属性设置的属性.
基本上,如果你只写:
self.locationManager = [[CLLocationManager alloc] init];
Run Code Online (Sandbox Code Playgroud)
左侧的self.locationManagersetter保留对已分配的引用CLLocationManager.但右侧CLLocationManager参考本身从未发布过.此管理器的保留计数永远不会达到零,对象永远不会消失 - 这会导致内存泄漏.
有两种方法可以解决这个问题.无论autorelease你在代码中见过分配的对象段,您引用的-或者你的分配对象分配给一个临时变量,保留临时变量的locationManager属性,然后明确地释放临时变量:
CLLocationManager *_temporaryReference = [[CLLocationManager alloc] init];
self.locationManager = _temporaryReference; // this is retained
[_temporaryReference release];
Run Code Online (Sandbox Code Playgroud)
就内存管理而言,这两种方法都是等效的.有些人更喜欢第二种方法,因为他们不喜欢等待自动释放池被"清空",尤其是在像iPhone这样的低内存设备上,这样可以更加严格地控制对象的生命周期.
Apple的Objective-C编程语言文档更详细地解释了这个属性.
| 归档时间: |
|
| 查看次数: |
1088 次 |
| 最近记录: |