2009-08-01 143 views
1

首先,我從未在我的應用程序中看到如此多的內存問題,因爲在閱讀關於內存如何在obj-C中運行的文章後,我開始放置「自我」。現在,我得到各種問題(揭示了我的編碼的sl iness)。當然,我是Objective-C的新手,我承認在我的人生之前,我從未有過很多與內存管理有關的問題。但我認爲這需要習慣才能習慣。UINavigationViewController內存釋放

現在,對我的問題。

我有一個類接口屬性(self.todoCreate),它擁有對上述控制器的引用。通過按下按鈕導航該控制器。

@property (nonatomic, retain) TodoTaskCreateController *todoCreate; 

下面的代碼是導致導航視圖改變的片段:

TodoTaskCreateController *viewController = [[TodoTaskCreateController alloc] 
        initWithNibName:@"TodoTaskCreateController" 
          bundle:[NSBundle mainBundle]]; 

self.todoCreate = viewController; 
[viewController release]; 
// slide-in todoCreate controller. 
if (self.navigationController != nil && self.todoCreate != nil) { 
    [self.navigationController pushViewController:self.todoCreate animated:YES]; 
} 

因此,這裏是我的問題:

我第一次運行這個它的工作原理。 一旦我在第二個視圖屏幕上,我回到主視圖。 如果我嘗試再次導航第二次,那麼應用程序崩潰,在self.todoCreate正在分配viewController

請注意,在主視圖的viewDidAppear方法中,我呼叫[self.todoCreate release]

任何人都可以解釋這一點嗎?

PS - 難怪這麼多iPhone應用程序隨機崩潰。

回答

0

我不會很快說話,但它似乎已經解決了崩潰,只需將viewController添加到autorelease池中,然後刪除其版本的所有手動發生。

現在,如果我的@property for createTodo被定義爲(nonatomic,retain)而不是(nonatomic,assign)?

+0

如果你做「自我」。todoCreate = `具有`retain`屬性,舊值將被釋放;如果您對`assign`屬性執行相同的操作,則舊值不會被釋放。 – 2009-08-02 22:02:32

1

todoCreate是一個屬性,當你分配一個值給它,這意味着,它調用了一個名爲setTodoCreate方法,它看起來像:

- (void) setTodoCreate:(Foo*) newVal 
{ 
    [todoCreate release]; // release the previous object 
    todoCreate = [newVal retain]; // point to new object, and also retain it 
} 

現在你viewDidAppear方法釋放self.todoCreate此時保留計數的todoCreate爲0。當你創建一個新的TodoTaskCreateController並將其分配給self.todoCreate另一release進行,但這次保留的0

計數代替對象上,你應該使用self.todoCreate = nil

您可能不應該不斷破壞並創建您的TodoTaskCreateController

您對應用程序崩潰的評論很可能是由於開發人員未測試其應用程序以查看它是否正確處理內存警告。在模擬器中有一個菜單選項來模擬這個,你的應用程序應該「存活」它的觀點所有的警告。