IOS设置Viewcontroller属性访问错误

时间:2012-10-03 23:20:03

标签: ios xcode uiviewcontroller nsdate

我正在尝试从父级设置子视图控制器(DateViewController)的属性,并在第二次执行时遇到错误的访问错误。这是代码。这是DateViewController.h。问题在于selectedDate属性:

#import <UIKit/UIKit.h>

@protocol DateViewDelegate <NSObject>
-(void) dateViewControllerDismissed:(NSDate *)selectedDate;
@end

@interface DateViewController : UIViewController {
    IBOutlet UIDatePicker *dateReceipt;
    id myDelegate;
}

-(IBAction)btnDone;
@property(nonatomic,assign)NSDate *selectedDate;
@property(nonatomic,assign)id<DateViewDelegate> myDelegate;
@end

在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,我从datepicker控件中选择日期,并且控制器被解除。在父视图控制器中,调用dateViewControllerDismissed并将receiptDate设置为selectedDate参数。下次单击日期按钮时,出现错误的访问错误,我将DateViewController的selectedDate属性设置为receiptDate。我假设这是某种内存问题,我没有正确处理。 IOS编程对我来说还是新的。

2 个答案:

答案 0 :(得分:0)

我在您的代码中发现了一些可能导致应用程序崩溃的问题。实际上它们是内存管理问题。

  1. 将自动释放的对象分配给receiptDate

    receiptDate = [NSDate date];
    

    当您稍后尝试使用此值时,它会导致应用程序崩溃,因为receiptDate点可能已经释放的内存。您可以通过保留值来修复它:

    receiptDate = [[NSDate date] retain];
    

    并在dealloc或你正在改变它的任何地方发布(我不知道它是如何声明的。它应该是retain属性)。

  2. 您正在分配NSDate而不保留它:

    receiptDate = selectedDate;
    

    你可以通过保留来解决它:

    receiptDate = [selectedDate retain];
    
  3. 我很抱歉因为我无法在Objective-C中编写内存管理的所有方面。如果您不熟悉iOS内存管理,最好使用ARC。

    您可以在Apple的这两个指南中找到很多有用的信息:Advanced Memory Management Programming GuideMemory Management Programming Guide for Core Foundation

答案 1 :(得分:0)

您的财产永远不会被保留。我建议做的是将属性声明中的assign更改为retain。这将解决您的问题,您无需在设置selectedDate的任何地方致电retain。该物业将为您做到这一点。

如果您没有使用ARC,请不要忘记在dealloc方法中将属性设置为nil,如下所示:

self.selectedDate = nil;

请注意,我使用self.selectedDate。重要的是,selectedDate作为属性而不是变量进行访问。