Obj-C,在线分配的对象的潜在泄漏... NSMutableArray alloc

时间:2011-11-11 09:14:07

标签: objective-c xcode cocoa-touch analyzer

我在追踪内存泄漏错误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但是这给了我同样的错误。

我做错了什么?

1 个答案:

答案 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:

  • 您拥有自己创建的任何对象,方法是为其分配内存或复制它,即使用方法allocallocWithZone:copycopyWithZone:,{ {1}},mutableCopy

  • 如果您不是某个对象的创建者,但希望确保它留在内存中供您使用,则可以通过调用mutableCopyWithZone:

  • 如果您拥有一个对象,无论是通过创建它还是表达所有者权益,您都有责任在不再需要它时通过调用retainrelease

  • 相反,如果您不是某个对象的创建者并且未表达所有者权益,则不得将其释放。

  • 如果您从程序的其他位置收到某个对象,通常会保证其在收到的方法或功能中保持有效。如果您希望它在该范围之外保持有效,则应保留或复制它。如果您尝试释放已经解除分配的对象,程序将崩溃。

您不必撰写autorelease。当您setMyProperty属性时,会为您创建该方法。