首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >iPhone:这是泄漏还是不泄漏?

iPhone:这是泄漏还是不泄漏?
EN

Stack Overflow用户
提问于 2010-02-12 15:27:27
回答 7查看 886关注 0票数 5

最近,Stack溢出上的某个人告诉我,下面的代码没有泄漏,该属性处理保留本身:

代码语言:javascript
复制
self.locationManager = [[CLLocationManager alloc] init];

在dealloc中:

代码语言:javascript
复制
   self.locationManager = nil;

在.h文件中:

代码语言:javascript
复制
@property (nonatomic, retain) CLLocationManager *locationManager;

我认为这是一个明显的漏洞,并认为这应该能解决这个漏洞:

代码语言:javascript
复制
self.locationManager = [[[CLLocationManager alloc] init] autorelease];

然而,他声称这是行不通的,因为用他的话说:“您不自动释放类的属性。为保留而定义的属性的自动生成访问器将自动处理保留。”

他让我怀疑他是否错了,还是我根本不懂内存管理?

编辑1:是代码

代码语言:javascript
复制
self.myName=[NSSting stringWithFormat:@"%@ is correct.", @"TechZen"];

与.

代码语言:javascript
复制
 self.locationManager = [[[CLLocationManager alloc] init] autorelease];

内存管理-明智?

这家伙说第一个是正确的,并拒绝了第二个。为什么第二个会是如此错误?据我所见,这两种方法都将自动释放的实例分配给某些属性,但仍然存在一个顽固的论点,即第二个实例是错误的。我看不出来,任何帮助都是很受欢迎的。

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2010-02-12 15:48:44

在这种情况下,计数保留和释放会有所帮助。这绝对是个泄密。您的locationManager对象将保留2次:一次由alloc/init调用,一次由属性保留。将属性设置为nil只会释放locationManager一次。

对于Edit 1中给出的例子,它们确实是相同的。听起来,另一个开发人员不愿立即自动发布,或者不太明白autorelease的功能。

票数 7
EN

Stack Overflow用户

发布于 2010-02-12 15:55:58

retain属性选项的语义如下:

  • 旧值(如果有的话)获得发布消息
  • 新值获得保留消息

因此,在setter之后,CLLocationManager实例的保留计数为2。一个来自阿莱克,另一个来自保留者。您应该在setter之后发送一条发布消息:

代码语言:javascript
复制
CLLocationMamnager *aLocationManager = [[CLLocationManager alloc] init];
self.locationManager = aLocationManager;
[aLocationManager release];

或者,将其添加到自动发布池中,以便它最终至少是免费的。就像你自己写的:

代码语言:javascript
复制
self.locationManager = [[[CLLocationManager alloc] init] autorelease];

更好的是,不要使用选项。保留它作为赋值(默认),您将设置为go,因为您使用的是保留的对象。

票数 4
EN

Stack Overflow用户

发布于 2010-02-12 19:12:42

以下语句保留了两次,因此必须两次发布:

代码语言:javascript
复制
self.locationManager = [[CLLocationManager alloc] init];

最好的写法如下:

代码语言:javascript
复制
self.locationManager = [[[CLLocationManager alloc] init]autorelease];

现在,这个变量只保留了一次,您可以在类的dealloc函数中释放它。

此外,如果运行以下代码行,则称为发行版:

代码语言:javascript
复制
locationManager = nil;

由于locationManager是合成的,当您将它设置为零时,它首先被释放。

此外,如果您执行了以下操作,将首先发布locationManager,然后在幕后重置:

代码语言:javascript
复制
self.locationManager = foo;

最后,以下内容将与exc_bad_access崩溃,因为当您将其设置为foo时,将双释放locationManager:

代码语言:javascript
复制
self.locationManager = [[[CLLocationManager alloc] init]autorelease];
[locationManager release];
self.locationManager = foo;
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2252816

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档