繁体   English   中英

Mac OS X 10.6中的NSOperation是否存在错误?

[英]Is there a bug in NSOperation in Mac OS X 10.6?

如果在发送-init之前释放NSOperation实例, NSOperation出现segmentation fault

我认为这是有效代码的原因:

  • 苹果在其文档中对此进行了说明
  • Gnustep在其implementation of NSNumber做到了这一点,因此可以肯定的是,这也在Apple的代码中。 (至少是。)
  • NSObject-init不执行任何操作,因此,属于NSObject -release应该在此之前起作用。
// gcc -o test -L/System/Library/Frameworks -framework Foundation test.m

#import <Foundation/Foundation.h>

int main(int argc, char *argv[]) {
    NSOperation *theOperation = [NSOperation alloc];
    [theOperation release];
}
  • 您认为这是一个错误吗?
  • 您能给我看看另一个具有相同行为的类的例子吗?
  • 知道为什么会这样吗?

将除init以外的任何消息发送到尚未初始化的对象都是无效的代码AFAIK。 调用超类的初始值设定项,然后释放,我敢打赌它不会崩溃(尽管让一个类的初始值设定项返回一个完全不相关的类会令我感到doubleplusungood)。

该代码没有远程有效的方法。

将-init重写为:

- (id) init
{
    if (self = [super init]) {
        [self release];

        NSNumber *number = [[NSNumber alloc] initWithInteger:6];
        return number;
    }
    return self;
}

当然,代码仍然是胡说八道,但不会崩溃。

在传递消息自我之前,您必须始终调用超级的初始化程序。 而且您必须始终按照上面显示的模式进行操作。

我认为您需要在调用release之前初始化您的超类,但是根据Apple文档中的此示例 ,情况并非如此。

因此,这可能是一个错误,但肯定不是重要的错误。

我以前的分析并不正确。

但是,我想指出的是,不同的类可能会发生此问题。 实际上,这取决于您要子类化。 子类化NSObject没问题,但是例如,子类化NSOperation,NSOperationQueue和NSThread就是一个问题。

发生这种情况的原因是,就像您可能会做的那样,子类的类可能会在其-init方法中分配内容。 这也是您将未分配的变量设置为nil的地方(以后可能会在代码中这样做)。

因此,通过不带-init情况下对自己调用-release ,可能会导致您的父类之一释放它尚未分配的对象。 而且他们无法检查其对象是否为nil ,因为它甚至没有机会初始化所需的每个对象/值。

这也可能是为什么在没有init的情况下释放NSOperation在10.5上有效而在10.6上无效的原因。 10.6实现已被重写为使用块和Grand Central Dispatch,因此,它们的initdealloc方法可能已发生很大变化,从而在那段代码上产生了不同的行为。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM