2012-07-07 91 views
1

這裏沒有太多的代碼,但這個問題嚴重地讓我煩惱!NSTimer不會失效

.H:

@interface processController : UIViewController { 
     NSTimer *timer; 
} 
@property (nonatomic, retain) NSTimer *timer; 

.M:

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    timer = [NSTimer scheduledTimerWithTimeInterval:0.5 target:self selector:@selector (main) userInfo:nil repeats:YES]; 
} 
- (void)main { 
    NSLog(@"testing"); 
} 
- (void)viewDidUnload { 
    [self.timer invalidate]; 
    self.timer = nil; 
} 

奇怪的是,當我火了這樣的代碼:

ViewController *main = [[ViewController alloc] initWithNibName:nil bundle:nil]; 
    [self presentModalViewController:main animated:YES]; 

和切換視圖時,計時器保持射擊!我究竟做錯了什麼?

回答

5

viewDidUnload視圖時從屏幕中刪除,但在由應用程序接收只存儲器警告不被調用。當UIViewController被釋放時,它也不會被調用。從蘋果公司的文檔:

當低內存條件發生並且不需要當前視圖控制器的 視圖,該系統可以選擇從 內存中刪除這些看法。這個方法在視圖控制器的視圖 被釋放後調用,並且是您執行任何最終清理的機會。如果您的視圖控制器存儲對視圖或其子視圖的單獨引用,則應使用此方法來釋放這些引用。您還可以使用此方法刪除對您創建的任何對象的引用,以支持該視圖,但現在不再需要該視圖,因爲該視圖不再需要。您不應該使用此方法釋放用戶數據或任何其他無法輕易重新創建的信息。

你最有可能意味着使用viewWillDisappear

- (void)viewWillDisappear:(BOOL)animated 
{ 
    [super viewWillDisappear:animated]; 
    [self.timer invalidate]; 
    self.timer = nil; 
} 

你可能想開始新的計時器在viewWillAppear中:爲viewDidLoad中被儘快控制器的視圖屬性被稱爲訪問。當視圖被顯示時不是緊張的。

- (void)viewWillAppear:(BOOL)animated 
{ 
    [super viewWillAppear:animated]; 
    timer = [NSTimer scheduledTimerWithTimeInterval:0.5 target:self selector:@selector(main) userInfo:nil repeats:YES]; 
} 

我建議你閱讀從UIViewController documentation對viewDidLoad中和viewDidUnload以及viewWillAppear中和viewWillDisappear的討論。

+2

是的,值得注意的是,當你的VC被釋放時,甚至不會調用viewDidUnload,它實際上*只有*當VC *仍然在*時,但是你的視圖在屏幕外,然後操作系統發送低內存(或類似的情況)。根據我的經驗,這只是我在導航層次結構中深入2或3層並模擬低內存。 – 2012-07-07 16:34:24

+0

感謝@ctrahey指出我應該澄清何時調用viewDidUnload。爲了更加清晰,添加了Apple對該方法的描述。 – 2012-07-07 16:43:50

+0

此外,將所有實例-viewDidUnload和-viewDidLoad轉換爲-view(Will | Did)將是明智的選擇:-view(Will | Did)將消失:到10月份時爲止。向聰明人說話。 – 2012-07-07 17:20:05