将被调用,只要保留该对象的 计数变为零,最好的地方我读过的dealloc的对象。
是的。
为了简单起见,请将包含currentColor
对象的类称为ColorContainer
。现在,如果你创建的ColorContainer
像下面的一个实例:
ColorContainer* containerColor = [[ColorContainer alloc] init]; // retain count + 1
为containerColor
保留计数变为1。
假设您创建了一个UIColor
的实例,并将该实例设置为currentColor
属性。在这种情况下,您可以采用两种不同的方式。 在第一个中,您可以创建如下的实例。如果您使用像initWithRed:green:blue:alpha:
这样的实例方法,则必须明确释放内存。
UIColor color* = [[UIColor alloc] initWithRed:0 green:0 blue:0 alpha:1]; // retain count + 1
containerColor.currentColor = color; // retain count +1, the referenced object has a retain count of 2 because you use a retain policy
[color release]; // retain count -1, now the referenced object has a retain count of 1
在第二种方法中,您可以使用类方法(+符号)。在这种情况下,您不需要释放内存显式,因为在该类方法中创建的对象将在应用程序生命周期的某个时间点自动释放。
containerColor.currentColor = [UIColor whiteColor]; // retain count +1
现在假设您发布了containerColor
对象。如果containerColor
的保留计数等于1,则将其从使用该对象的对象中释放,它允许调用其dealloc方法,因此也可以消除由currentColor
引用的对象。
在你要注意到,currentColor
引用的对象是完全从内存(解雇)移除了这个简单的案例,只有当它有保留的。事实上计数,如果你这样做
UIColor color* = [[UIColor alloc] initWithRed:0 green:0 blue:0 alpha:1]; // retain count + 1
containerColor.currentColor = color; // retain count +1, the referenced object has a retain count of 2
//[color release];
你创建了一个内存泄漏(你明白了吗?)。
总之,当你使用retain
,copy
,init
或new
(这是相同的alloc-init
),你必须总是叫对口release
或autorelease
。
作为一个经验法则,您需要总是平衡对象的保留计数以避免内存泄漏。
所以,作为一个美眉,你可以像树一样思考记忆。假设你有一个父母(containerColor
)和一个孩子(currentColor
)。如果父(保留计数为1)被释放,它会导致为其对象调用其dealloc方法和空闲内存。如果在其dealloc方法中释放一个子项(保留计数为1),它会导致调用其dealloc方法和空闲内存。如果孩子的保留数大于1,则会导致内存泄漏。
希望它有帮助。
编辑
对于你能读懂About Memory Management进一步的信息。自iOS 5 Apple推出ARC以来,自动引用计数是一种编译器机制,提供Objective-C对象的自动内存管理。有关信息,请参阅Transitioning to ARC Release Notes。
Hello Flex,非常感谢您的回答。 – karthick
不客气! –