2012-10-03 88 views
0

我想從父級設置子視圖控制器(DateViewController)的屬性,並在第二次訪問時發生錯誤。這是代碼。這是DateViewController.h。問題在於selectedDate屬性: IOS設置Viewcontroller屬性訪問錯誤

裏面DateViewController.m,我綜合selectedDate。現在在父視圖控制器(ComdataIOSViewController.m)中,我將DateViewController的selectedDate屬性設置爲變量receiptDate,它在ComdataIOSViewController.h的@interface部分中聲明爲NSDate *。這是ComdataIOSViewController.m的一個片段:

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    receiptDate = [NSDate date]; 
} 

-(IBAction)btnSetDate { 
    dlgDate=[[DateViewController alloc] initWithNibName:nil bundle:nil]; 
    dlgDate.selectedDate = receiptDate; 
    dlgDate.myDelegate = self; 
    [self presentModalViewController:dlgDate animated:true]; 
    [dlgDate release]; 
} 

-(void) dateViewControllerDismissed:(NSDate *)selectedDate 
{ 
    NSDateFormatter *dateFormat = [[[NSDateFormatter alloc] init] autorelease]; 
    [dateFormat setDateStyle:NSDateFormatterShortStyle]; 
    receiptDate = selectedDate; 
    dateString = [dateFormat stringFromDate:receiptDate]; 
    lblDate.text = dateString; 
} 

所以我第一次單擊父控制器上設定的日期按鈕,在出現DateViewController,我選擇從日期選擇器控制權的日期,以及控制器駁回。在父視圖控制器中,dateViewControllerDismissed被調用,並將receiptDate設置爲selectedDate參數。下次我點擊日期按鈕時,出現錯誤的訪問錯誤,我將DateViewController的selectedDate屬性設置爲receiptDate。我假設這是某種內存問題,我沒有正確處理。 IOS編程對我來說仍然是新的。

回答

0

我在代碼中發現了幾個可能導致應用程序崩潰的問題。其實他們是內存管理問題。

  1. 正在分配自動釋放對象receiptDate

    receiptDate = [NSDate date]; 
    

    時,你會嘗試使用這個值後,它會導致應用程序崩潰,因爲內存中receiptDate點可能已經發布。你可以通過保留值修正:(我不知道它是怎麼宣佈它應該是retain屬性)

    receiptDate = [[NSDate date] retain]; 
    

    和釋放在dealloc或任何你正在改變它。

  2. 你不保留其分配NSDate

    receiptDate = selectedDate; 
    

    你可以通過保留修復:

    receiptDate = [selectedDate retain]; 
    

我很抱歉,因爲我不能寫內存管理的各個方面在Objective-C中。如果您不熟悉iOS內存管理器,最好使用ARC。

你可以從蘋果這兩個指南找到很多有用的信息:Advanced Memory Management Programming GuideMemory Management Programming Guide for Core Foundation

0

你的財產是永遠不會保留。我會建議做的是在您的財產聲明中將assign更改爲retain。這將解決您的問題,並且您無需在設置selectedDate的任何地方撥打retain。該物業將爲您做到這一點。

如果你不使用ARC,不要忘記設置該屬性爲nil在dealloc方法,像這樣:

self.selectedDate = nil; 

請注意,我用self.selectedDate。這是非常重要的,以便selectedDate作爲屬性訪問,而不是變量。

+0

我應該提到,我以前確實有財產設置保留,它沒有任何區別(即使你是正確的 - 它應該被設置爲保留)。下面的答案解決了我的問題。 – Bob

+0

很高興您解決了您的問題。 :) –