我有一个关于内存管理的问题。我有一个我以前在init *方法中分配的实例变量。在我的程序的某些方面,我保留了这个对象。 在我的dealloc方法中,如果我将此对象设置为nil,它是否会被正确释放? 让我举个例子。这是A.h班:
@interface A: NSObject {
B *bvariable;
}
-(id) init;
和他的实施:
@implementation A
-(id) init: {
bvariable= [[B alloc] init];
/**
* Let say for some reason, I called
*/
[bvariable retain];
}
}
-(void) dealloc {
bvariable = nil;
[super dealloc];
}
我的问题是当GC在A类上调用 dealloc 时, bvrariable 会被正确解除分配吗?
我的猜测是否定的,因为我保留了这个对象,所以我必须两次调用 release 来释放该对象。将对象设置为nil将不会释放它们,因为我仍然向bvrariable对象发送消息。 但有人告诉我相反的情况。
有人可以点缀我吗?
感谢您的建议!!
答案 0 :(得分:0)
我的问题是GC何时会打电话 关于A类的dealloc,将是 bvrariable是否可以正确解除分配?
不,
1)在iOS内存管理中没有使用GC。
2)在dealloc
中,您只需将此指针设置为nil
(在dealloc中无意义的事情) - 对象本身未被释放或/和解除分配。
我的猜测不是因为我 保留了这个对象,所以我必须打电话 释放两次以释放该对象。
右。顺便说一下,alloc
之后我无法看到保留此对象的任何合理理由 - 您已声明拥有该对象。
答案 1 :(得分:0)
通常,每个以alloc / init / copy / new开头的方法都应返回一个保留对象。如果再次保留此对象,则保留计数为2.要完全释放对象,您必须释放两次。
将对象设置为nil时释放对象的故事仅适用于使用垃圾收集(GC)的情况。目前这不适用于iOS,只适用于Mac OS。