【问题标题】:Objective-C memory management and nil?Objective-C 内存管理和 nil?
【发布时间】:2011-07-31 16:13:47
【问题描述】:

在我的书中,*joystick 被分配了@property (nonatomic, retain),并且它没有被释放,只是在-dealloc 方法中设置为nil。在-init 方法中,相同的操纵杆被设置为nil。这是什么意思?

【问题讨论】:

  • 如果它没有在dealloc中释放,如果它在init中分配或保留,那就是内存泄漏。例如:myproperty = [aProperty 保留] 或 self.myproperty = aProperty

标签: objective-c memory


【解决方案1】:

如果你有这样的属性:

@property (nonatomic, retain)

synthesize 生成的 setter 方法将负责释放 ivar 当前指向的对象,然后再将新对象分配给它。所以,

self.property = xxx;

相当于(如果你喜欢的话):

if (property != xxx) {
    [xxx retain];
    [property release];
    property = xxx;
}

现在,在释放 ivar 后将其设置为 nil 被认为是一种很好的做法:

[property release];
property = nil;

这是 ObjC 中常见的发布习惯。

如您所见,如果您将 nil 分配给一个属性(即,上面示例中的 xxx = nil),您将得到的就是:ivar 将被释放并将其值设置为 nil。因此,将 nil 分配给属性只是这种“释放习惯用法”的简写。

【讨论】:

  • +1,但正确的property = xxx;——应该是property = [xxx retain];
  • @Anton:你是对的,谢谢!我是靠记忆写的,想着发布部分……
  • 感谢您的回复!这是否意味着像 @property (nonatomic, retain) NSString *name 这样的东西只需要在 dealloc 方法中设置为 nil 吗?并且在 dealloc 方法中释放它是可选的?
  • 您可以在有意义的时候将属性设置为 nil(考虑一个标签,当它为非 nil 时显示它,当它为 nil 时不显示)。如果您关心内存泄漏,您应该始终以一种或另一种方式在dealloc 中释放。不要指望能够预见到你的 ivars 会发生什么,这样你就可以跳过这个......此外,属性使它变得如此简单......
  • 我想说self.property = xxx' 等价于if (property != xxx) { [property release]; property = [xxx retain]; },即保留也应该只在 xxx 不等于已经存在的值时发生。 IIRC,这也被锁包围了,但我可能记错了。
【解决方案2】:

属性本质上是自动生成的访问器方法给你的 ivars,你甚至可以覆盖属性,所以如果你的属性是调用操纵杆,那么自动生成方法等于

- (void)setJoystick:(MyType *)aValue
{
    if( aValue != joystick )
    {
        [joystick release];
        joystick = [aValue retain];
    }
}

如果您没有非原子,那么实际上会发生更多事情,并且可能有一些东西可以处理线程访问。

Sp 你可以看到如果你设置 self.joystick 你调用 setJoystick: with nil 并释放当前值并将 ivar 设置为 nil

【讨论】:

  • 感谢您的回复!是保留操纵杆还是 aValue?在joystick = [aValue retain];
  • 两者都是,aValue 和joystick 是指向内存中某个位置的指针。将指针视为指向内存块的索引,初始操纵杆的值为 6,指向内存块 6,aValue 的值为 8,指向内存块 8,[操纵杆释放],告诉块 6 的内存减少其引用计数, [aValue retain] 只是增加内存块 8 的保留计数,然后返回 8,这样摇杆现在被赋值为 8,指的是完全相同的内存块。
  • 谢谢!我现在了解@synthesize 中发生了什么。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-12
  • 1970-01-01
相关资源
最近更新 更多