2012-04-12 59 views
1

我有一個視圖控制器,其中有兩種方法可以返回。Dealloc不被稱爲

第一種情形是這樣的:

RecordVC - >告訴DelegatedismissRecordVC: - >RecordVC解僱和重新分配

第二種情況是這樣的:

RecordVC - >告訴DelegatedismissAndShowVideosForRecordVC: - >RecordVC已解僱和VideosTVC贈送但是RecordVC未被取消分配。

第一種情形是觸發像這樣:

- (IBAction)back:(id)sender { 
    if ([_chromaKeySessionManager isWriting]) { 
     [_chromaKeySessionManager cancelWriting]; 
    } 
    [_chromaKeySessionManager stopRunning]; 
    [delegate dismissRecordVC:self]; 
} 

委託方法dismissRecordVC:是這樣的:

- (void)dismissRecordVC:(RecordVC *)vc { 
    [self dismissModalViewControllerAnimated:YES]; 
} 

如果使用此back:方法,那麼RecordVC被釋放就好了。

第二種情況是觸發像這樣:

- (IBAction)goToVideos { 
    if ([_chromaKeySessionManager isWriting]) { 
     [_chromaKeySessionManager cancelWriting]; 
    } 
    [_chromaKeySessionManager stopRunning]; 
    [delegate dismissAndShowVideosForRecordVC:self]; 
} 

和委託的dismissAndShowVideosForRecordVC:方法:

- (void)dismissAndShowVideosForRecordVC:(RecordVC *)vc { 
    [self dismissViewControllerAnimated:YES completion:^{ 
     VideosTVC *vc = [[VideosTVC alloc] init]; 
     [[self navigationController] pushViewController:vc animated:YES]; 
     [vc release];  
    }]; 
} 

因此,在這種情況下,RecordVC永遠不會被釋放。這裏唯一的區別就是我用一個完成塊和另一個控制器來解除它。

對我來說,在這兩種情況下看起來完全相同的(只要保留/釋放去),除了在第一個它RecordVC得到的重新分配並且在後一種情況下它永遠不會被釋放。奇怪,我知道我不應該這樣說,但似乎是內部泄漏。

有什麼我保留,我不知道用完成塊解僱的時候嗎? 感謝

+0

dismissViewControllerAnimated是UIViewController的方法。看看這裏:http://developer.apple.com/library/ios/#DOCUMENTATION/UIKit/Reference/UIViewController_Class/Reference/Reference.html – 0xSina 2012-04-12 00:51:38

+0

在這種情況下,你的代碼中的某個地方有一個VideoTVC被保留的引用(保留?)。 – 2012-04-12 00:53:43

+0

我真的需要檢查嗎?有兩種情況,在一種情況下,它可以很好地解除分配,另一種情況是,你可以在那裏看到,沒有什麼區別,沒有引用被保留,但它從未被釋放。但我會再次檢查以確保 – 0xSina 2012-04-12 00:55:39

回答

0

一個區別是,在完成塊參照self。這會導致它至少被保留下來,直到火災發生。無可否認,之後它應該被釋放。

嘗試創建塊的本地外部以容納[self navigationController],然後在該塊中使用該局部因此沒有提及self

我還要指出的是,在-dismissAndShowVideosForRecordVC:你有一個參數,並與同名的地方。應該不重要,但也許有編譯器錯誤。

+1

我想到了這一點,但當我意識到自己不是被保留的東西時,停下了自己,它是呈現的視圖控制器。 – borrrden 2012-04-12 01:21:12

+0

啊,好點。我失去了蹤跡。 ;) – 2012-04-12 01:25:00

+0

感謝您的意見。好的調用,沒有看到相同的變量名,所以改變了(但仍然沒有區別)。爲navController創建了一個局部塊,沒有區別.. :( – 0xSina 2012-04-12 01:29:18