RetainCount == 坏
retainCount
是禁忌、不可靠、不可预测的,一般不应该使用。我没有在我的代码中的任何地方使用它,但是我在一个以一种有趣的方式使用的类中看到了它。
我有一个类运行一个无限期运行的线程,直到线程被取消。问题是线程增加了所有者的保留计数,在我的例子中是实例化它的类。所以,即使我用完了那个类,那个实例仍然会挂起,除非管理我的类的人也有聪明的知识来关闭线程。这是一种解决方案,但这是我在代码中找到的。
- (oneway void)release
{
// This override allows allows this object to be dealloced
// by shutting down the thread when the thread holds the last reference.
// Otherwise, the object will never be dealloc'd
if (self.retainCount == 2)
{
[self quitDispatchThread];
}
[super release];
}
这是一个聪明的解决方案,但我不知道该怎么想。它覆盖类上的释放并检查保留计数是否为 2。换句话说,它检查线程是否是唯一使我的对象保持活动状态的线程(因为保留计数即将从 2 减少到 1 ),如果是,它终止线程(quitDispatchThread
将阻塞直到线程终止)。
所以...
你可以依靠retainCount来看看它是不是一个?
通常人们会说要远离,retainCount
因为你不知道那里是否有一些自动释放。但是,如果retainCount 是一个,那么我知道只有线程保持它处于活动状态,并且我不必担心retainCount 可能由于某些自动释放等而关闭......
这段代码有什么问题?
我正要删除它,但它实际上似乎是有道理的。其他对象不必知道我的类正在运行线程。其他对象甚至可以安全retain
地拥有线程的对象,而不必担心关闭线程,因为它会照顾自己。release
autorelease
这段代码实际上感觉很干净,这让我感到惊讶。
编辑 :: NSThread 正在保留我的对象
我使用 NSThread 的事实增加了我的对象的保留计数。我的对象是 thetarget
并且selector
是线程运行的方法。
initWithTarget:选择器:对象:
返回使用给定参数初始化的 NSThread 对象。
- (id)initWithTarget:(id)目标选择器:(SEL)选择器对象:(id)参数
参数
目标
选择器指定的消息发送到的对象。
选择器
要发送到目标的消息的选择器。此选择器只能接受一个参数,并且不能有返回值。
争论
传递给目标的单个参数。可能为零。
返回值
使用给定参数初始化的 NSThread 对象。
讨论
对于非垃圾收集的应用程序,方法选择器负责为新分离的线程设置一个自动释放池,并在它退出之前释放该池。垃圾收集应用程序不需要创建自动释放池。
对象目标和参数在分离线程的执行过程中被保留。当线程最终退出时,它们被释放。