0

希望我能解释得很好。 假定以下:Obj-C:正确释放循环中分配的对象

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

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

然后,在该程序的伪代码'访问像字典键的一些其它部分:

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的对象并将数组存储在循环外部。我在这里泄漏记忆,不释放它们?如果我释放他们,我怎么能这样做,我不会失去在我存储'样本'数组的单例中对他们的引用?

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

+0

请不要为这样的问题发布非编译代码。发布您正在使用的_actual_代码。基本上不可能说你的内存管理是否正确,因为这段代码是部分无意义的。它也不是伪代码;伪代码通常是语言和框架不可知的,并且会忽略诸如alloc/init之类的东西。 –

回答

1

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

此外,您的实例变量必须是指针:

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

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

的NSMutableArray进行保留并且当它们被添加和移除分别在对象上释放。所以你得到一个保留的分配,然后第二保留添加。当数组被销毁时,它将释放一个。这留下您保留计数为1.

您可以使这些autorelease。我相信它可以提高性能,让内存一起发布,并且是推荐的方法。