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];
}
Run Code Online (Sandbox Code Playgroud)
这是一个聪明的解决方案,但我不确定该怎么想.它会覆盖类上的释放并检查保留计数是否为2.换句话说,它会检查线程是否是保持对象存活的唯一因素(因为保留计数将从2减少到1)如果是,则终止线程(quitDispatchThread将阻塞直到线程终止).
所以...
通常人们会说要保持清醒,retainCount因为你不知道那里是否有一些自动释放.但是,如果retainCount是1,那么我知道只有线程保持活着的事实我不必担心retainCount可能因某些自动释放等而关闭...
我准备删除它,但它实际上似乎是有道理的.其他对象不必知道我的类正在运行一个线程.其他对象可以安全地retain和release甚至autorelease拥有线程,而不必担心查封了线程,因为它需要自己照顾的对象.
这段代码实际上感觉干净,令我感到惊讶.
我使用NSThread的事实增加了我的对象的保留计数.我的对象是,target并且selector是线程运行的方法.
initWithTarget:选择器:对象:
返回使用给定参数初始化的NSThread对象.
- (id)initWithTarget:(id)目标选择器:(SEL)选择器对象:(id)参数 …