第二个对象在第二个对象被释放时没有被释放,除非我在dealloc中将指针设置为nil,这似乎不正确。
我认为当对象被dealloc'd时,ARC应该默认将所有指针设置为nil,从而释放任何拥有的对象。
这是我的代码(仅限于核心):
@interface Obj1 : NSObject
{
Obj2 *obj2;
}
@interface Obj2 : NSObject
{
}
@implementation Obj1
-(void)dealloc
{
obj2 = nil; // <--- This is needed to get obj2 to be dealloc'd.
NSLog(@"Obj1 dealloc");
}
-(id)init
{
if ((self = [super init]) == nil)
return nil;
obj2 = [[Obj2 alloc] init];
return self;
}
@end
@implementation Obj2
-(void)dealloc
{
NSLog(@"Obj2 dealloc");
}
-(id)init
{
if ((self = [super init]) == nil)
return nil;
return self;
}
@end
我做错了吗?我读过的所有内容都说这应该有效。没有其他人持有obj2,因为设置为nil释放它。我已经尝试了使用和不使用dealloc函数的代码,以防万一它弄乱了,我得到了相同的结果。
有问题的文件被编译为obj-c ++,但我没有用c ++和对象做任何事情。
感谢。
答案 0 :(得分:1)
这绝对应该按照您期望的方式工作。你可能在代码中偶然做了一些事情,你已经从你的例子中混淆或剪裁了。为了演示,您可以将下面的代码保存到某个文件,例如arc_tst.m
,编译它并从终端运行它。您将看到它打印出所有预期的日志语句,然后通过释放两个对象来结束。这些对象与此处发布的示例代码完全一样(证明问题很可能出现在实际代码的其他部分)。
要编译它,假设您已将其命名为arc_tst.m
,请转到保存文件的目录,然后输入以下内容:
$ clang -fobjc-arc -o arc_tst arc_tst.m -framework foundation
$ ./arc_tst
<强> arc_tst.m 强>
// build with: clang -fobjc-arc -o arc_tst arc_tst.m -framework foundation
#import <Foundation/Foundation.h>
@class Obj1, Obj2;
@interface Obj1 : NSObject
{
Obj2* _obj2;
}
@end
@interface Obj2 : NSObject
{
}
@end
@implementation Obj1
- (id)init
{
if( (self = [super init]) )
{
_obj2 = [[Obj2 alloc] init];
}
return self;
}
- (void)dealloc
{
NSLog(@"Obj1 Dealloc");
}
@end
@implementation Obj2
- (id)init
{
if( (self = [super init]) )
{
}
return self;
}
- (void)dealloc
{
NSLog(@"Obj2 Dealloc");
}
@end
int main (int argc, char const *argv[])
{
@autoreleasepool {
Obj1* obj = [[Obj1 alloc] init];
NSLog(@"after alloc, have obj1: %@", obj);
sleep(2);
NSLog(@"after sleep, have obj1: %@", obj);
obj = nil; // force ARC to trash obj
NSLog(@"after nil on obj1, about to exit");
}
return 0;
}