在目标c中,一个类可以基本上删除自己吗?

Nos*_*tap 1 xcode objective-c ios

在目标c中,假设我有一个Obj存储在NSMutableArray中的对象,并且数组指向它的指针是Obj整个程序中唯一的强指针.现在假设我调用了一个方法,Obj并在另一个线程中运行此方法.在这个方法中,如果Obj设置指针本身等于nil它将基本上删除自己?(因为没有更强的指针了)我怀疑答案是否定的,但为什么呢?如果这确实有效,那么它是不好的编码实践(我认为它不是很好的编码,但它实际上是不是很糟糕?)

UIA*_*dam 5

如果您的代码设计正确,则对象极不可能导致自己的释放/释放.所以,是的,你描述的情况表明编码实践不好,实际上可能导致程序崩溃.这是一个例子:

@interface Widget : NSObject
@property (retain) NSMutableArray *array;
@end

@implementation Widget

@synthesize array;

- (id)init
{
    self = [super init];
    if(self) {
        array = [[NSMutableArray alloc] init];
        [array addObject:self];
    }
    return self;
}

- (void)dealloc
{
    NSLog(@"Deallocating!");
    [array release];
    [super dealloc];
}

- (void)removeSelf
{
    NSLog(@"%d", [array count]);
    [array removeObject:self];
    NSLog(@"%d", [array count]);
}
@end
Run Code Online (Sandbox Code Playgroud)

然后这段代码在另一个类中:

Widget *myWidget = [[Widget alloc] init];
[myWidget release];  // WHOOPS!
[myWidget removeSelf];
Run Code Online (Sandbox Code Playgroud)

对NSLog in的第二次调用removeSelf将导致EXC_BAD_ACCESS,因为此时array已经释放并且不能在其上调用方法.

这里至少有几个错误.最终导致崩溃的一个事实是,无论什么类创建和使用myWidget对象,在它完成使用之前释放它(调用removeSelf).没有这个错误,代码运行正常.但是,MyWidget不应该有一个实例变量,它首先会创建一个强引用,因为这会创建一个保留周期.如果有人试图在myWidget没有第一次调用的情况下释放,则不会释放任何内容removeSelf,并且您可能会发生内存泄漏.