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。我相信它可以提高性能,讓內存一起發佈,並且是推薦的方法。