[英]Is there a bug in NSOperation in Mac OS X 10.6?
如果在发送-init
之前释放NSOperation
实例, NSOperation
出现segmentation fault
。
我认为这是有效代码的原因:
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,因此,它们的init
和dealloc
方法可能已发生很大变化,从而在那段代码上产生了不同的行为。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.