2

添加的UINavigationController按鈕是否需要自動釋放?這段代碼好嗎?添加的UINavigationController按鈕是否需要自動發佈?這段代碼好嗎?

背景 - 在開始觸發「內存警告」後,我看到一系列導航問題出現在我的應用程序中。我想知道這是否與我在這裏提出的問題有關。問題包括:

  1. 代碼是正確的?
  2. 其他地方需要額外的內存管理代碼嗎? (例如,dealloc方法? - 我現在有沒有代碼在這裏要解除任何按鍵)模擬內存警告
  • 任何其他提示重新什麼可能與導航欄人口/使用一個UINavigationController屏幕流問題會錯誤下面

    代碼:

    - (void)viewDidLoad { 
        [super viewDidLoad]; 
        self.navigationItem.rightBarButtonItem = [ 
        [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:self action:@selector(addAction:)] autorelease]; // IS AUTORELEASE HERE CORRECT? 
        self.navigationItem.leftBarButtonItem = self.editButtonItem; 
        self.title = @"Views"; 
    

    感謝

  • +1

    該代碼沒有任何問題,因爲navigationItem將保留您在那裏初始化的UIBarButtonItem,所以一旦它已經被自動釋放,它就不會從內存中釋放。 – Jason 2011-05-27 05:11:40

    回答

    3

    我始終只使用自動釋放,我認爲它應該做的很好。

    -1
    - (void)viewDidLoad { 
        [super viewDidLoad]; 
        UIBarButtonItem *rightBarButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:self action:@selector(addAction:)]; // IS AUTORELEASE HERE CORRECT? 
        self.navigationItem.rightBarButtonItem = rightBarButton; 
    [rightBarButton release]; 
        self.navigationItem.leftBarButtonItem = self.editButtonItem; 
        self.title = @"Views"; 
    } 
    
    +0

    此答案與原始代碼沒有實際差異。在同一行上自動釋放對象在功能上與創建,設置和釋放相同。也許如果你擴大你的答案來解釋爲什麼你認爲這是一個更好的方法,而不是僅僅傾銷一些代碼,我會重新考慮我的倒票。 – Jasarien 2011-05-27 11:27:55

    +0

    @Jasarien總是手動發佈比autorelease更好http://stackoverflow.com/questions/2076402/what-is-the-difference-between-releasing-and-autoreleasing – xydev 2011-05-30 11:19:42

    +0

    我不同意。手動釋放並不總是更好。在這個特定的例子中,它沒有什麼不同。自動釋放極不可能導致任何可察覺的差異手動釋放,因爲沒有緊密的循環或其他任何可能導致運行循環長時間不清空自動釋放池的事件。自動釋放是一個非常有用和強大的模式,不應該因爲手動釋放「更好」這一事實而感到氣餒,就像你說的那樣。 – Jasarien 2011-05-30 19:18:28