2011-07-19 73 views
0

這是代碼,它在[unosUpisa release]時不起作用;和[unosRazlike發佈];進入;關於在函數中分配和釋放對象的問題

如何正確釋放這些unosUpisa和unosRazlike對象?

-(IBAction) padIliStilja: (id) sender 
{ 
    NSNumber *unosUpisa = [[NSNumber alloc] init]; 
    NSNumber *unosRazlike = [[NSNumber alloc] init]; 
    if ([sender tag] == 1) 
    { 
    unosUpisa = [NSNumber numberWithInt: 162 + [Data variables].zvanja]; 
    unosRazlike = [NSNumber numberWithInt: 0]; 
    } 
    else if ([sender tag] == 2) 
    { 
     unosRazlike = [NSNumber numberWithInt: 252 + [Data variables].zvanja]; 
     unosUpisa = [NSNumber numberWithInt: 0]; 
    } 

    if ([Data variables].upisZaMi == NO) 
    { 
     [[Data variables].rezultatMi addObject: unosUpisa]; 
     [[Data variables].rezultatVi addObject: unosRazlike]; 
    } 
    else 
    { 
     [[Data variables].rezultatVi addObject: unosUpisa]; 
     [[Data variables].rezultatMi addObject: unosRazlike]; 
    } 

    [self dismissModalViewControllerAnimated: NO]; 
    [unosUpisa release]; 
    [unosRazlike release]; 
} 
+0

如果您打算將'unosUpisa'和'unosRazlike'重新分配給不同的自動釋放變量,爲什麼要初始化/分配它們以便開始? –

回答

0

你必須release每一個對象,你自己(你保留,複製,或init/alloced)。 您最終釋放對象的方式是正確的,但是,這裏unosRazlike = [NSNumber numberWithInt: 0];,您分配了unosRazlike另一個值,而不釋放前一個,這裏是泄漏。
此外,用這種方法,你應該保留你的對象。

所以:

unosRazlike = ... 
// first 
[unosRazlike release]; 
unosRazlike = [[NSNumber numberWithInt: 0] retain]; 
// ... 
[unosRazlike release]; 

編輯

-(IBAction) padIliStilja: (id) sender 
{ 
    // this is no matter 
    NSNumber *unosUpisa = [[NSNumber alloc] init]; 
    NSNumber *unosRazlike = [[NSNumber alloc] init]; 
    if ([sender tag] == 1) 
    { 
     // don't forget to release them ! 
     [unosUpisa release]; [unosRazlike release]; 
     // and to retain (numberWithInt returns autoreleased object 
     unosUpisa = [[NSNumber numberWithInt: 162 + [Data variables].zvanja] retain]; 
     unosRazlike = [[NSNumber numberWithInt: 0] retain]; 
    } 
    else if ([sender tag] == 2) 
    { 
     // same again 
     [unosUpisa release]; [unosRazlike release]; 
     // and to retain (numberWithInt returns autoreleased object 
     unosRazlike = [[NSNumber numberWithInt: 252 + [Data variables].zvanja] retain]; 
     unosUpisa = [[NSNumber numberWithInt: 0] retain]; 
    } 

    if ([Data variables].upisZaMi == NO) 
    { 
     [[Data variables].rezultatMi addObject: unosUpisa]; 
     [[Data variables].rezultatVi addObject: unosRazlike]; 
    } 
    else 
    { 
     [[Data variables].rezultatVi addObject: unosUpisa]; 
     [[Data variables].rezultatMi addObject: unosRazlike]; 
    } 

    [self dismissModalViewControllerAnimated: NO]; 
    [unosUpisa release]; 
    [unosRazlike release]; 
} 

但只是一個想法...爲什麼初始化 '空白' 對象數量,如果你設置的值或者在if或在其他部分?

剛剛宣佈他們

NSNumber *unosRazlike, *unosUpisa; 

,並在的if/else設置它們的值。

+0

你能否修改我的代碼,以便我可以看到它的工作原理? – vburojevic

+0

當然,我會編輯 – 2011-07-19 14:18:54

+0

我試圖聲明他們在代碼的開始: NSNumber * unosRazlike,* unosUpisa;但我得到SIGABRT 這裏是在pastebin中的代碼: http://pastebin.com/Z1GFiK0X – vburojevic

0

嘗試在關閉ViewController之前移動呼叫。當您的ViewController已經發布時釋放內存並沒有多大意義。

+0

是的,試圖這樣,我試圖把它解僱後 – vburojevic

0

首先要動態分配的NSNumber然後在你的病情

if ([sender tag] == 1) 
{ 
unosUpisa = [NSNumber numberWithInt: 162 + [Data variables].zvanja]; 
unosRazlike = [NSNumber numberWithInt: 0]; 
} 
else if ([sender tag] == 2) 
{ 
    unosRazlike = [NSNumber numberWithInt: 252 + [Data variables].zvanja]; 
    unosUpisa = [NSNumber numberWithInt: 0]; 
} 

你是在棧上分配的NSNumber,從而失去對動態allocted NSNumber的連接。

一個更好的辦法是

if ([sender tag] == 1) 
{ 
unosUpisa = [[NSNumber alloc] initWithInt: 162 + [Data variables].zvanja]; 
unosRazlike = [[NSNumber alloc] initWithInt: 0]; 
} 
else if ([sender tag] == 2) 
{ 
    unosRazlike = [[NSNumber alloc] initWithInt: 252 + [Data variables].zvanja]; 
    unosUpisa = [[NSNumber alloc] initWithInt: 0]; 
} 
+0

我已經把NSNumber * unosUpisa;和NSNumber * unosRazlike;然後嘗試你的代碼,但我得到一個NSException – vburojevic

+0

它更具體地說什麼? –

+0

程序接收信號「SIGABRT」,這是 unosRazlike = [[NSNumber alloc] numberWithInt:252 + [Data variables] .zvanja]; – vburojevic

0

在Xcode 4中打開項目,轉至產品菜單並選擇分析。 Xcode將爲您的文件添加藍色註釋標記,並提供完整的文檔以解決您在此方法中可能存在的任何內存管理錯誤。

閱讀警告,解決它們,並確保您瞭解它們以備將來參考。