最近,Stack溢出上的某个人告诉我,下面的代码没有泄漏,该属性处理保留本身:
self.locationManager = [[CLLocationManager alloc] init];在dealloc中:
self.locationManager = nil;在.h文件中:
@property (nonatomic, retain) CLLocationManager *locationManager;我认为这是一个明显的漏洞,并认为这应该能解决这个漏洞:
self.locationManager = [[[CLLocationManager alloc] init] autorelease];然而,他声称这是行不通的,因为用他的话说:“您不自动释放类的属性。为保留而定义的属性的自动生成访问器将自动处理保留。”
他让我怀疑他是否错了,还是我根本不懂内存管理?
编辑1:是代码
self.myName=[NSSting stringWithFormat:@"%@ is correct.", @"TechZen"];与.
self.locationManager = [[[CLLocationManager alloc] init] autorelease];内存管理-明智?
这家伙说第一个是正确的,并拒绝了第二个。为什么第二个会是如此错误?据我所见,这两种方法都将自动释放的实例分配给某些属性,但仍然存在一个顽固的论点,即第二个实例是错误的。我看不出来,任何帮助都是很受欢迎的。
发布于 2010-02-12 15:48:44
在这种情况下,计数保留和释放会有所帮助。这绝对是个泄密。您的locationManager对象将保留2次:一次由alloc/init调用,一次由属性保留。将属性设置为nil只会释放locationManager一次。
对于Edit 1中给出的例子,它们确实是相同的。听起来,另一个开发人员不愿立即自动发布,或者不太明白autorelease的功能。
发布于 2010-02-12 15:55:58
retain属性选项的语义如下:
因此,在setter之后,CLLocationManager实例的保留计数为2。一个来自阿莱克,另一个来自保留者。您应该在setter之后发送一条发布消息:
CLLocationMamnager *aLocationManager = [[CLLocationManager alloc] init];
self.locationManager = aLocationManager;
[aLocationManager release];或者,将其添加到自动发布池中,以便它最终至少是免费的。就像你自己写的:
self.locationManager = [[[CLLocationManager alloc] init] autorelease];更好的是,不要使用选项。保留它作为赋值(默认),您将设置为go,因为您使用的是保留的对象。
发布于 2010-02-12 19:12:42
以下语句保留了两次,因此必须两次发布:
self.locationManager = [[CLLocationManager alloc] init];最好的写法如下:
self.locationManager = [[[CLLocationManager alloc] init]autorelease];现在,这个变量只保留了一次,您可以在类的dealloc函数中释放它。
此外,如果运行以下代码行,则称为发行版:
locationManager = nil;由于locationManager是合成的,当您将它设置为零时,它首先被释放。
此外,如果您执行了以下操作,将首先发布locationManager,然后在幕后重置:
self.locationManager = foo;最后,以下内容将与exc_bad_access崩溃,因为当您将其设置为foo时,将双释放locationManager:
self.locationManager = [[[CLLocationManager alloc] init]autorelease];
[locationManager release];
self.locationManager = foo;https://stackoverflow.com/questions/2252816
复制相似问题