在文档中有一个 addObject: NSAutoreleasePool 方法。
我想过这个:
NSString *myString = [[NSString alloc] initWithCString:"这行得通吗?"]; [thePool addObject:myString]; [另一个池 addObject:myString];
那可能吗?我总是读到我只能将对象添加到自动释放池堆栈的最顶层。
在文档中有一个 addObject: NSAutoreleasePool 方法。
我想过这个:
NSString *myString = [[NSString alloc] initWithCString:"这行得通吗?"]; [thePool addObject:myString]; [另一个池 addObject:myString];
那可能吗?我总是读到我只能将对象添加到自动释放池堆栈的最顶层。
是的你可以。但你永远不应该。绝对没有理由这样做。
您正在做的事情是可能的,但可能会在运行时导致异常,因为 myString 将-release
在释放后发送一条消息(假设最后剩余的引用来自第一个池)。通常,正如-[NSAutoreleasePool addObject:]
文档所述,您不应手动将对象添加到自动释放池中,而应调用-autorelease
该对象。这会将对象放入当前线程的活动自动释放池中(每个线程都有自己的自动释放池)。
由于Apple的这一点,我现在有点困惑:
当一个对象被自动释放时——也就是说,当一个对象被发送一个自动释放消息或者当它作为参数传递给 addObject: 类方法时——它总是被放入堆栈顶部的自动释放池中。
另一方面,他们没有在 NSAutoreleasePool 类参考中提到它。所以我猜即使我在一个特定的对象上调用 addObject:,它也会进入自动释放池堆栈顶部的对象。其实我得试试看;)