我仍然通過學習內存分配和Objective-C(我的第一次運行漏洞最多隻有一次機會)。這是一個當前的問題,我希望每個人都能理解它,我已經使用了一些僞代碼,但我不相信我已經放棄了任何東西。即使變量未被使用,釋放一個指針也會導致程序崩潰
我有一些數據庫的東西一排類集,我們將使用:
@interface Row : NSObject {
int rowID;
NSString *firstName;
NSString *lastName;
}
我有我的數據庫類的getRow功能,看起來是這樣的:
-(Row *) getRow
{
rowPlaceholder = [[Row alloc] init];
...
rowPlaceholder.rowID = column1;
rowPlaceholder.firstName = column2;
rowPlaceholder.lastName = column3;
...
return [rowPlaceholder autorelease]; //<-----Problem is happening here
}
現在在我的ViewController中,我對這種情況有兩個重要的功能:
-(void) viewWillAppear:(BOOL)animated{
currentRow = [[Row alloc] init];
currentRow = getRow;
firstNamelabel.text = currentRow.firstName;
}
第二個功能是一個按鈕被第二個字:
-(IBAction)btnLastName:(id)sender{
lastNamelabel.text = currentRow.lastName; //<---Crashes the program
}
所以,你可以看到,使用currentRow針對導致程序崩潰,並且我所能不明白的是,如果我不釋放rowPlaceholder該程序工作正常。此時爲什麼currentRow關心來自另一個函數的數據,因爲它已經擁有了它想要的東西(來自getRow()的一個值)。
後者是我的錯誤。你能向我解釋在內存方面發生了什麼?當我做這樣的回報時,它只是被返回的指針嗎?所以最後,這兩個指針都指向了內存中的同一個位置,直到有人被自動釋放,讓另一個困惑? – ballofpopculture
您分配了一個新的Row對象並將其分配給currentRow。然後你明顯地將一個不同的Row對象分配給currentRow。第一個對象仍然存在(儘管你不能再解決它),被保留(通過'alloc'),並且是「泄漏」。 –
至於你的崩潰,這很可能是因爲,在'viewWillAppear'和調用'btnLastName'的按鈕push之間,autorelease池被清空(因爲它應該是,當UI出現空氣時),以及結果你的Row對象已經走了。 –