我在追踪内存泄漏错误Potential leak of an object allocated on line...
@interface BNPieChart : UIView {
@private
NSMutableArray* slicePointsIn01;
}
m
- (id)initWithFrame:(CGRect)frame {
if (self = [super initWithFrame:frame]) {
[self initInstance];
self.frame = frame;
slicePointsIn01 = [[NSMutableArray alloc]
initWithObjects:nFloat(0.0), nil];
- (void)initInstance {
slicePointsIn01 = [[NSMutableArray alloc]
initWithObjects:nFloat(0.0), nil];
我确实尝试为slicePointsIn01
添加属性/ synthesize / dealloc但是这给了我同样的错误。
我做错了什么?
答案 0 :(得分:4)
slicePointsIn01
设置为两个不同的对象:initInstance
中的一个,然后initWithFrame:
中的一个。
因为第一个对象设置为alloc
'd对象,所以在更改赋值之前该对象永远不会是release
,原始对象会被泄露。
如果添加属性,则需要确保实际使用它,而不是直接使用实例变量。您可以通过以下两种方式之一进行分配来实现这一目标:
self.myProperty = //something;
[self setMyProperty: //something];
注意(感谢@André):确保something
对象在分配时保留计数为0(通常是自动释放),因为该属性会为您保留它。
//NOT like this:
myProperty = //something;
此行直接使用实例变量。它会导致泄漏,因为不使用该属性,指向的对象的引用计数不会改变。
修改强> 你不应该检查保留计数。只需遵循您使用该对象的每个地方的规则,您就可以了。 Here are the rules:
您拥有自己创建的任何对象,方法是为其分配内存或复制它,即使用方法alloc
,allocWithZone:
,copy
,copyWithZone:
,{ {1}},mutableCopy
如果您不是某个对象的创建者,但希望确保它留在内存中供您使用,则可以通过调用mutableCopyWithZone:
如果您拥有一个对象,无论是通过创建它还是表达所有者权益,您都有责任在不再需要它时通过调用retain
或release
相反,如果您不是某个对象的创建者并且未表达所有者权益,则不得将其释放。
如果您从程序的其他位置收到某个对象,通常会保证其在收到的方法或功能中保持有效。如果您希望它在该范围之外保持有效,则应保留或复制它。如果您尝试释放已经解除分配的对象,程序将崩溃。
您不必撰写autorelease
。当您setMyProperty
属性时,会为您创建该方法。