在 objective-c 中,假设我在NSMutableArray中存储了一个对象Obj,并且指向该数组的指针是整个程序中唯一指向Obj的强指针。现在假设我在Obj上调用了一个方法,并在另一个线程中运行了该方法。在这种方法中,如果Obj将自身的指针设置为等于nil,它将实质上删除自身吗? (因为将不再有更强大的指针了)我怀疑答案是否定的,但是为什么呢?如果这行得通,那是不好的编码习惯吗(我认为它不是很好的编码,但实际上是不好的吗?)

最佳答案

如果您的代码设计正确,则对象极不可能导致其自身的释放/重新分配。因此,是的,您描述的情况表明不良的编码习惯,并且实际上可能导致程序崩溃。这是一个例子:

@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

然后此代码在另一个类中:
Widget *myWidget = [[Widget alloc] init];
[myWidget release];  // WHOOPS!
[myWidget removeSelf];

第二次调用removeSelf中的NSLog将导致EXC_BAD_ACCESS,因为array当时已被释放,并且无法调用方法。

这里至少有一些错误。最终导致崩溃的原因是,无论正在创建和使用myWidget对象的任何类在其使用完毕(调用removeSelf)之前都会将其释放。没有这个错误,代码将运行良好。但是,MyWidget不应具有首先创建对其自身的强引用的实例变量,因为这会创建一个保留周期。如果有人尝试在不先调用myWidget的情况下释放removeSelf,则不会释放任何内容,并且可能会发生内存泄漏。

10-08 05:23