0

さて、私はイベントと呼ばれるこのクラスを手に入れました。

これには、NSDateであるeventDateというプロパティがあります。イベントの日付から何年経過したかを返すメソッドを作成しました。

- (double)yearsSinceEvent {
    double years;

    // Get the system calendar
    NSCalendar *sysCalendar = [NSCalendar currentCalendar];

    // Create the NSDates
    NSDate *date1 = self.eventDate; 
    NSDate *date2 = [NSDate  date];


    // Get conversion to months, days, hours, minutes
    unsigned int unitFlags = NSYearCalendarUnit;

    NSDateComponents *conversionInfo = [sysCalendar components:unitFlags fromDate:date1  toDate:date2  options:0];

    years = [conversionInfo year];

    [date1 release];
    [date2 release];

    return years;
}

テーブルビューセルを構成するときは、次のようにします。

cell.textLabel.text = [[events objectAtIndex:indexPath.row] name];
cell.detailTextLabel.text = [NSString stringWithFormat:@"%d year's ago", [events objectAtIndex:indexPath.row] yearsSinceEvent]];

しかし、これはこのエラーをスローします:

*** __NSAutoreleaseFreedObject():以前に割り当て解除されたオブジェクト(0x595bda0)のリリースは無視されます

私はここで何が間違っているのですか?

date1とdate2をリリースしない場合、エラーは発生しませんが、メソッドは0を返します。

代わりにセル構成メソッドでyearsSinceEventコードを実行し、日付1と日付2をリリースしない場合は機能します。

これはどのようにすればよいですか?

4

2 に答える 2

2

この場合、リリースdate1しないでくださいdate2
date2ファクトリメソッドで作成され、自動リリースされます。
date1は、保持せずに別のプロパティから読み取ったものであるため、そのプロパティを解放しないでください。そうしないと、self.eventDateが解放されます。

Cocoaメモリ管理ルール

名前が「alloc」または「new」で始まるメソッドまたは「copy」を含むメソッド(alloc、newObject、mutableCopyなど)を使用してオブジェクトを作成する場合、またはオブジェクトに保持メッセージを送信する場合は、オブジェクトの所有権を取得します。リリースまたは自動リリースを使用して、所有するオブジェクトの所有権を放棄するのはユーザーの責任です。オブジェクトを受け取ったときは、それを解放してはなりません。

于 2010-07-22T07:35:39.193 に答える
1

date1とdate2はすでに自動リリースされているため、リリースしないでください。eventDateivarが保持されたプロパティとして適切に宣言されていることを確認してください。@property (nonatomic, retain) NSDate *eventDate;

于 2010-07-22T07:30:36.497 に答える