0

親から子ビュー コントローラー (DateViewController) のプロパティを設定しようとしていますが、2 回目にアクセス エラーが発生します。これがコードです。これは 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 プロパティを、ComdataIOSViewController.h の @interface セクションで NSDate * として宣言されている変数 receptorDate に設定します。これは 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 が呼び出され、recipientDate を selectedDate パラメーターに設定します。次に日付ボタンをクリックすると、DateViewController の selectedDate プロパティを rececutionDate に設定すると、不正なアクセス エラーが発生します。これは、正しく処理していない何らかのメモリの問題であると想定しています。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 の次の 2 つのガイドで多くの有用な情報を見つけることができます: Advanced Memory Management Programming GuideおよびMemory Management Programming Guide for Core Foundation

于 2012-10-04T02:11:27.953 に答える
0

あなたの財産は決して保持されません。私が提案するのは、プロパティ宣言のassigntoを変更することです。retainこれで問題が解決し、retainselectedDate を設定したすべての場所で呼び出す必要がなくなります。宿泊施設がそれを行います。

ARC を使用していない場合は、次のように、dealloc メソッドでプロパティを nil に設定することを忘れないでください。

self.selectedDate = nil;

self.selectedDate を使用していることに注意してください。selectedDate が変数ではなくプロパティとしてアクセスされることが重要です。

于 2012-10-04T02:21:57.830 に答える