Obj-C:正确释放循环中分配的对象

时间:2011-08-19 19:15:48

标签: objective-c memory-management memory-leaks release-management retain

希望我能解释清楚。 假设如下:

@interface ClassA : NSObject {
   NSMutableArray firstArray;
   NSArray secondArray;
}

#import "ClassA"
@interface ClassB : NSObject {
   ClassA classAobject;
}

然后在程序的其他部分'Psuedo-code'访问字典键,如:

NSMutableArray* sample = [[NSMutableArray alloc] init];
for (keys in Data)
{
    ClassA* aObj = [[ClassA alloc] initWith: objectForKey:@"KeyHere" andWith:@"Key2Here"];

    ClassB* bObj = [[ClassB alloc] init];
    [bObj setClassAObj: aObj];

    [sample addObject: bObj];
}
Singleton* single = [Singleton single];
[single setArray: sample];

我的问题是在循环内创建的ClassA和ClassB对象以及将它们存储在循环外部的数组。我在这里泄漏记忆,不释放它们吗?如果我确实发布它们,我怎么能这样做,以至于我不会在我存储'sample'数组的单例中丢失对它们的引用?

如果重要,它所存储的Singleton数组将在类的“init”方法中进行分配和初始化。

2 个答案:

答案 0 :(得分:1)

向数组添加对象会保留对象。所以你需要在添加它们之后释放它们(如果没有自动释放)。同样,您需要确保将实例变量数组(在Singleton中)的@properties设置为retain,以便在单例中设置时保留样本数组。然后你也需要发布样本。

此外,您的实例变量需要是指针:

@interface ClassA : NSObject {
   NSMutableArray *firstArray;
   NSArray *secondArray;
}

#import "ClassA"
@interface ClassB : NSObject {
   ClassA *classAobject;
}

答案 1 :(得分:1)

NSMutableArray分别在添加和删除对象时对对象执行保留和释放。所以你得到一个保留为alloc,然后第二个保留添加。当数组被销毁时,它将释放一个。这使得保留计数为1。

您可以进行这些自动释放。我相信它可以提高性能,让内存一起发布,是推荐的方法。