2012-05-08 41 views
0

如果非要 ClassA.h釋放物體,存儲器管理,目標C

1. @屬性(非原子,保留)的NSMutableArray * ARR;

ClassA.m

- (ClassA的)功能{

1.ClassA *obj = [[ClassA alloc] init]; 
    // initialize the arr 
    // add another object into the arr 
    2. [obj.arr addObject:nameOfAnObject] 
    3. return obj; 

}

在ClassB的,我想打電話給(ClassA的)功能方法。我所做的是

ClassB.m

- (無效)viewDidLoad中{

1.[super viewDidLoad]; 
    2.ClassA  *classAinB = [[classA alloc] init];                   
    3.classAinB = [classA function]; 
    4.[classAinB release]; 

}

根據內存管理的規則,因爲我自己的ClassAinB在ClassB.m,所以我最終解放了它。我的問題是我在ClassA.m中擁有的var ClassA如何釋放它,以便在ClassB的第3行回調之後,我仍然擁有其arr包含的ClassA對象nameOfAnObject object

請在這個問題上給我建議。任何意見都歡迎在這裏。謝謝

回答

2

將它添加到autorelease池。即return [obj autorelease];。這將確保對象在運行循環迭代結束時發送release消息,前提是它不再擁有任何所有者。

+0

如何識別ID:ClassA * obj = [[[ClassA alloc] init] autorelease] ;.它的意思是返回[[obj autorelease]]; – tranvutuan

+0

你也可以這樣做。它做同樣的事情,因爲它全部在相同的運行循環迭代中完成。 – mprivat

1

只要你有一個alloc你需要一個相應的release來匹配它。

在帶有LLMV編譯器(和ARC啓用)的XCode 4.2 +中,您不必擔心引用計數,因此當您的對象爲alloc時,您無需擔心調用release,實際上您可以因爲編譯器會拋出一個錯誤。

+0

's/iOS 5+/ARC' – deanWombourne

+0

我認爲你的意思是如果你啓用了ARC,而不是ios5 + – Martin

+0

我修改了我的回覆,使其更加正確。 –

1

如果使用手動保持釋放: 您分配2個classA對象。一個 - 當你從classB函數直接分配它時,另一個 - 當你在該函數內調用classA函數時。所以,當第3行執行時,會破壞第一個classA對象上的鏈接(覆蓋classAinB var),這是內存泄漏。 如果您希望使用返回您的classA對象的工廠方法,請將該方法設爲靜態。