我正在尝试从父级设置子视图控制器(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编程对我来说还是新的。
答案 0 :(得分:0)
我在您的代码中发现了一些可能导致应用程序崩溃的问题。实际上它们是内存管理问题。
将自动释放的对象分配给receiptDate
:
receiptDate = [NSDate date];
当您稍后尝试使用此值时,它会导致应用程序崩溃,因为receiptDate
点可能已经释放的内存。您可以通过保留值来修复它:
receiptDate = [[NSDate date] retain];
并在dealloc
或你正在改变它的任何地方发布(我不知道它是如何声明的。它应该是retain
属性)。
您正在分配NSDate
而不保留它:
receiptDate = selectedDate;
你可以通过保留来解决它:
receiptDate = [selectedDate retain];
我很抱歉因为我无法在Objective-C中编写内存管理的所有方面。如果您不熟悉iOS内存管理,最好使用ARC。
您可以在Apple的这两个指南中找到很多有用的信息:Advanced Memory Management Programming Guide和Memory Management Programming Guide for Core Foundation
答案 1 :(得分:0)
您的财产永远不会被保留。我建议做的是将属性声明中的assign
更改为retain
。这将解决您的问题,您无需在设置selectedDate的任何地方致电retain
。该物业将为您做到这一点。
如果您没有使用ARC,请不要忘记在dealloc方法中将属性设置为nil,如下所示:
self.selectedDate = nil;
请注意,我使用self.selectedDate。重要的是,selectedDate作为属性而不是变量进行访问。