【问题标题】:IOS Setting Viewcontroller property bad access errorIOS设置Viewcontroller属性bad access错误
【发布时间】:2012-10-03 23:20:02
【问题描述】:

我正在尝试从父级设置子视图控制器 (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 的 sn-p:

- (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 编程对我来说还是个新手。

【问题讨论】:

    标签: ios xcode uiviewcontroller nsdate


    【解决方案1】:

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

    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

    【讨论】:

      【解决方案2】:

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

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

      self.selectedDate = nil;
      

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

      【讨论】:

      • 我应该提到我之前确实将属性设置为保留并且它没有任何区别(即使您是正确的 - 它应该设置为保留)。下面的答案解决了我的问题。
      • 很高兴您解决了问题。 :)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-17
      • 1970-01-01
      • 2017-07-17
      相关资源
      最近更新 更多