相关疑难解决方法(0)

RetainCount可以在这个例子中使用吗?

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];
}
Run Code Online (Sandbox Code Playgroud)

这是一个聪明的解决方案,但我不确定该怎么想.它会覆盖类上的释放并检查保留计数是否为2.换句话说,它会检查线程是否是保持对象存活的唯一因素(因为保留计数将从2减少到1)如果是,则终止线程(quitDispatchThread将阻塞直到线程终止).

所以...

你能依靠retainCount看看它是否是一个?

通常人们会说要保持清醒,retainCount因为你不知道那里是否有一些自动释放.但是,如果retainCount是1,那么我知道只有线程保持活着的事实我不必担心retainCount可能因某些自动释放等而关闭...

这段代码出了什么问题?

我准备删除它,但它实际上似乎是有道理的.其他对象不必知道我的类正在运行一个线程.其他对象可以安全地retainrelease甚至autorelease拥有线程,而不必担心查封了线程,因为它需要自己照顾的对象.

这段代码实际上感觉干净,令我感到惊讶.

编辑:: NSThread正在保留我的对象

我使用NSThread的事实增加了我的对象的保留计数.我的对象是,target并且selector是线程运行的方法.

initWithTarget:选择器:对象:

返回使用给定参数初始化的NSThread对象.

  • (id)initWithTarget:(id)目标选择器:(SEL)选择器对象:(id)参数 …

objective-c nsthread ios retaincount

3
推荐指数
1
解决办法
247
查看次数

标签 统计

ios ×1

nsthread ×1

objective-c ×1

retaincount ×1