gpt4 book ai didi

objective-c - 在 objective-c 中,类可以实质上删除自身吗?

转载 作者:行者123 更新时间:2023-12-01 18:00:21 25 4
gpt4 key购买 nike

在 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,则不会释放任何内容,并且可能会发生内存泄漏。

关于objective-c - 在 objective-c 中,类可以实质上删除自身吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10856784/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com