0

我正在尝试从父级设置子视图控制器 (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 并将接收日期设置为 selectedDate 参数。下次我单击日期按钮时,我收到一个错误的访问错误,我将 DateViewController 的 selectedDate 属性设置为receiptDate。我假设这是某种我没有正确处理的内存问题。IOS编程对我来说仍然是新的。

4

2 回答 2

0

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

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

    receiptDate = [NSDate date];
    

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

    receiptDate = [[NSDate date] retain];
    

    并在dealloc您更改它的地方或任何地方发布(我不知道它是如何声明的。它应该是retain财产)。

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

    receiptDate = selectedDate;
    

    你可以通过保留来修复它:

    receiptDate = [selectedDate retain];
    

很抱歉,因为我无法在 Objective-C 中编写内存管理的所有方面。如果你对 iOS 内存管理不太了解,最好使用 ARC。

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

于 2012-10-04T02:11:27.953 回答
0

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

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

self.selectedDate = nil;

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

于 2012-10-04T02:21:57.830 回答