2012-11-07 52 views
0

我不想返回manch,因爲如果我autorelease之前,我將它返回它,它變得對他人無效。所以我想這:返回一個nsmutuableArray作爲一個指針,這是一個可變映射

classA 
-(NSMutableArray*)set:(NSMutableArray*)data 
    { 
     manch= [[data mutableCopy]autorelease] ; 
     int count=2*[data count]; //to not enter infinity loop 

     for(int k=0;k< count;k=k+2) 
     { 
      if(k==count-1) 
       [manch addObject:[NSNumber numberWithInt:![[manch objectAtIndex:k] integerValue] ] ]; 
     } 

     data=[manch mutuableCopy]; 
     return data; 
    } 

我的目標是創建一個類,得到一個NSMutuableArray做一些計算,比退貨,並不應依賴於這類了。

編輯:

隨着人們在這裏問。在另一個CLASSB(上述方法的用戶) ,我有在接口:

NSMutuableArray *data ; 

和.m文件init方法我有

data=[[NSMutuableArray alloc]init]; 

使用該函數從我的問題,我這樣做:

mIns=[[classA alloc]init]; 
data= [mIns set:[self decimalToBinary:autoWord]]; 

比我寬鬆data以後。

+2

我認爲你並不清楚autoreleasing如何工作。從函數返回一個自動釋放的對象是好的。接收者(呼叫者)將不得不保留它以保留它。 – DrummerB

+1

請發表實際的代碼;這是不可能的,如圖所示(拼寫錯誤等)。 (是的,返回一個自動釋放對象是好的,實際上你應該在這種情況下做什麼。) – Arkku

+1

順便說一句,你是否考慮切換到[自動引用計數(ARC)](http://developer.apple .COM /庫/ IOS /#閱讀發佈/的ObjectiveC/RN-TransitioningToARC /簡介/ Introduction.html)? – DrummerB

回答

1

我不想返回manch,因爲如果我在我返回之前自動釋放它,它就會對其他人無效。所以我想到這一點:

這是一個不正確的語句,你可以返回一個自動釋放的對象,這是一個理智的事情。值得注意的是,你應該正確地設計你的方法名稱,以通知用戶返回什麼樣的對象。任何名稱以allocnewcopymutableCopy開頭的方法都會返回一個保留的對象。 (Source

對於您的情況,您的方法名稱爲set:,它通知此方法的用戶它將返回一個非保留對象(幾乎總是一個autoreleased對象)。這是因爲它沒有前面提到的任何前綴。

在這種情況下,您遇到的問題是該方法的用戶;他們不保留對被返回對象的引用。因此,該方法的用戶應該使用它像這樣:

@interface ClassName() { 
    NSMutableArray* m_ivarArray; 
} 
@property (nonatomic, retain) NSMutableArray* propertyArray; 
@end 

NSMutableArray* data = ...; 

// If using a property with retain, setting via "self." will retain it for you 
self.propertyArray = [self set:data]; 

// If using an ivar (which doesn't do the retain for you) 
m_ivarArray = [[self set:data] retain]; 

您可以通過使用自動引用計數(ARC,More Information),將處理這種內存管理,爲您避免這些問題。 它仍然是重要的,你使用正確的命名約定,如ARC將判斷如何管理在此基礎上你的內存(在某些情況下)

更新:看到你更新後,我可以看到這個問題。

data=[[NSMutuableArray alloc]init]; 

這是創建的NSMutableArray一個新的實例,其中一個被正確地保留(由於我前面提到過)。

data= [mIns set:[self decimalToBinary:autoWord]]; 

這是替換data用新的NSMutableArray舉行的對象,一個是自動釋放。您創建的以前的實例已丟失,並且您已將其替換爲另一個實例。這個新實例還沒有保留,因此將被意外釋放。

要解決,你需要使用它代替:

NSMutableArray* data = [[mIns set:[self decimalToBinary:autoWord]] retain]; 

你並不需要分配/初始化變量是否會通過一些其他物體後面進行填充。我強烈建議您仔細研究這一切如何運作,this might be a good start

+0

非常感謝您的回答。返回值的用戶是另一個類中的NSMutuableArray,並首先被分配。這夠了嗎 ?或者我必須保留用戶從這個數組中獲得的價值? – Curnelious

+0

我不明白你的意思,你能提供顯示發生了什麼的代碼嗎?請將它添加到您的問題中,並且當您有問題時通知我。 – WDUK

+0

我編輯了我的問題。再次感謝 。 – Curnelious