【发布时间】:2009-02-25 23:05:08
【问题描述】:
如果我有一个NSMutableString,例如
NSMutableString *foo = [[NSMutableString alloc] init];
如果我将对象 foo = nil 清零,是否会将保留计数降低 1,从而有效地释放内存?此时我是否需要从堆中重新分配 foo 才能使用它?
【问题讨论】:
标签: iphone objective-c cocoa cocoa-touch
如果我有一个NSMutableString,例如
NSMutableString *foo = [[NSMutableString alloc] init];
如果我将对象 foo = nil 清零,是否会将保留计数降低 1,从而有效地释放内存?此时我是否需要从堆中重新分配 foo 才能使用它?
【问题讨论】:
标签: iphone objective-c cocoa cocoa-touch
请阅读the basic documentation。将变量 foo 设置为 nil 对其之前的内容没有任何影响。请记住,foo 只是一个指向对象的指针;要使用它,你必须让它指向一个有效的对象。只是让它不再指向该对象,并不会释放该对象。
【讨论】:
将 nil 分配给变量不会影响先前存在的值。保留计数仅降低release。
您应该阅读 Apple 的 Cocoa memory management guidelines。 Cocoa 的引用计数系统并没有那么难,但它是你必须学习的东西,如果你没有正确地学习它,你的程序就会有很多微妙的 bug 让你发疯。
【讨论】:
上面说的都是真的。您需要在该代码 sn-p 中发布。
但是,重要的是要记住,如果这样做是正确的,分配给 属性 会降低保留计数。那就是:
foo = nil; // doesn't lower
bar.foo = nil; // probably does
属性看起来像普通变量,但实际上并非如此;他们智能地处理自己的内存管理。与他们合作时要牢记这一点。
【讨论】:
是否会将保留计数降低 1,从而有效地释放内存?
没有
你应该使用
[foo release]
【讨论】:
foo = nil; 不会降低对象的保留计数。它只会使foo 指向无处而不是对象。要减少保留计数,您必须说 [foo release];。
【讨论】: