2012-10-03 76 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

很高兴您解决了您的问题。 :) –