将一个自动释放的对象设置为nil是否安全?我知道我不需要释放一个自动释放的对象,但如果我想要立即释放对象以最小化内存使用,我可以将对象设置为nil吗?
我可能在一段时间前读过这个问题,但我不记得在哪里看到的,我想确保这样做是安全的。
将一个自动释放的对象设置为nil是否安全?我知道我不需要释放一个自动释放的对象,但如果我想要立即释放对象以最小化内存使用,我可以将对象设置为nil吗?
我可能在一段时间前读过这个问题,但我不记得在哪里看到的,我想确保这样做是安全的。
我认为你错过了一些非常基本的东西。将对象设置为nil
对内存管理没有任何帮助。这里是发生的事情:alt text http://gallery.me.com/davedelong/100084/Pointers1/web.png?ver=12783505480001
在这个图像中,您有堆栈(其中包含本地变量;它更或多或少等同于您在执行代码时所处的位置)。如果您声明类似int bar = 42;
的内容,则bar
位于堆栈上。右侧是堆。这是属于您的应用程序的全局内存空间。堆是为解决作用域问题而发明的:如何使有用的信息存在当前函数(或方法)的范围之外。当我们malloc
空间时,我们被分配一个在堆上的内存槽。当您alloc/init
一个对象时,该对象位于堆上。在Objective-C中,所有对象都位于堆上。*因此,让我们考虑这行代码:
MyObject * foo = [[MyObject alloc] init];
MyObject
结构体。然后,我们把那块内存的位置赋值给一个叫做foo
的局部变量。在上面的图片中,左边的红色圆圈是foo
,右边的红色斑点是实际的MyObject
(以及它的所有数据)。到目前为止还清楚吗?nil
"(foo = nil;
)时会发生的事情。
alt text http://gallery.me.com/davedelong/100084/Pointers2/web.png?ver=12783505490001
你会看到对象仍然存在于堆上。实际上唯一改变的是你的局部变量foo
不再指向堆上的内存块。它指向0
(nil
,NULL
,无论你想怎么称呼它),这就是我们表示"这不再指向任何相关的东西"的方法。* 除了本地块,但只限于复制前。还有一些其他注意事项,但那已经涉及到奥秘了。
是的,这是一个好的实践,因为它表明对象未被使用 - 即没有引用数据。
值得一提的是,你也会在苹果的示例代码中看到它。
nil
是有益的。但即使在Mac上,GC也经常不被使用,在iOS上也不可用。仍然可能有设置nil
的潜在好处,例如确保没有过时的指针留下来陷阱不谨慎的编码人员,但它不会影响内存管理。 - walkytalky