1

UIPickerViewこのメソッドを呼び出して行が選択されるたびに、可変配列にオブジェクトを追加しています-

-(void)setScheduleStartDate:(NSString *)dateStr
{
    [scheduleDatesArray removeAllObjects];
    NSDateFormatter* df = [[NSDateFormatter alloc] init];
    df.dateFormat = @"d MMMM yyyy";
    scheduleStartDate = [df dateFromString:dateStr];

    /******* getting array of schedule dates     ***********/

    NSDate* scheduleEndDate = [scheduleStartDate dateByAddingTimeInterval:60*60*24*28*6]; // add six month (of 28 days) in schedule start date
    double endMS = [scheduleEndDate timeIntervalSinceDate:scheduleStartDate];

    for (double i =0; i < endMS; i = (i + 60*60*24*14)) {

        [scheduleDatesArray addObject:[NSNumber numberWithDouble:i]];
    }
}

このメソッドを数回呼び出した後、このエラー メッセージでクラッシュします

malloc: *** mmap(size=627101696) failed (error code=12)
*** error: can't allocate region
*** set a breakpoint in malloc_error_break to debug

アプリでブレークポイントを設定するとmalloc_error_break、for ループ (配列にオブジェクトを追加する場所) が中断されます。しかし、私は問題を見つけることができません.Googleで同じ問題を検索しましたが、まだ運がありません.

私が間違っていることを誰かが助けてくれますか?

4

1 に答える 1

2

1 か月が 28 日であるとか、1 分が 60 秒であるという仮定に基づいて日付を計算するべきではありません。

の代わりdateByAddingTimeInterval:NSCalendardateByAddingComponents:toDate:options:

NSDateComponents *sixMonthComponents = [[NSDateComponents alloc] init];
sixMonthComponents.month = 6;

NSCalendar *currentCalendar = [NSCalendar currentCalendar];
NSDate* scheduleEndDate = [currentCalendar dateByAddingComponents:sixMonthComponents toDate:scheduleStartDate options:0];

編集:私が理解していることから、〜14日ごとに時間間隔を配列に追加したいと考えています(月を28日と定義した半月)。より堅牢にするために、次のようなことを行います(テストされていませんが、機能するはずです。お知らせください):

// We increment i with the total interval between the two dates (endMS) divided by 12 (6 months * 2 times per month)
for (double i = 0; i < endMS; i += (endMS / 12) {
    [scheduleDatesArray addObject:@(i)];
}

追記[NSNumber numberWithDouble:i] 書け@(i)ます。

于 2013-08-09T09:50:13.047 に答える