0

在我的标题中,我有两个属性,如下所示。

@interface HZCalendarDataSource : NSObject
@property (strong, nonatomic) NSMutableArray *datesOnCalendar;
@property (strong, nonatomic) HZCalendarDay *currentDay;
@end

然后在我的实现的初始化程序中,我有以下代码行。

- (id)init {
    self = [super init];

    if (self) {
        // Alloc / Init instance variables.
        self.datesOnCalendar = [[NSMutableArray alloc] init];
                self.currentDay = [[HZCalendarDay alloc] init];

        HZCalendarDay *date = [[HZCalendarDay alloc] initOnDate:today withEventStore:self.eventStore];

        [self.datesOnCalendar addObject:date];
        // THIS line causes the app to freeze!
        // If this line is above [self.datesOnCalendar addObject:date];
        // Then it does not freeze. Why does this happen?
        self.currentDay = date;
    }

    return self;
}

我遇到的问题是,如评论中所示,该self.currentDay = date;行冻结了设备上的应用程序。但是,如果我将行移到self.currentDay = date;添加日期对象的行上方NSMutableArray,那么代码就可以正常工作。

所以我的问题是,为什么这个顺序很重要?它应该只是设置为引用我添加到正确self.currentDay的相同对象吗?dateNSMutableArray

如果有人可以向我解释这一点,我将不胜感激,我不明白。顺序并不重要,所以现在我已经在将日期对象添加到数组之前移动了要执行的麻烦行,但是出于教育目的,我想知道为什么这是第一个问题地方。

编辑:

在让应用程序冻结一段时间后,它在调用 [HZCalendarDateSource setCurrentDay:] 25,827 次后最终在 Xcode 中失败。它在调试器中出现 EXC_BAD_ACCESSS 失败,并且 -[__NSArrayM countByEnumeratingWithState:objects:count:];

希望这可以帮助。

谢谢!

4

1 回答 1

0

所以我想通了,在重新阅读错误消息后,听起来setter由于某种原因失败了,即使我没有实现它。

但是,我编写了一个辅助方法来循环遍历我的数组并对与我提供的参数匹配的项目执行一些操作。我调用了那个辅助方法setCurrentDay:,因此我遇到了命名冲突。我的代码卡在了我编写的 for 循环中。for 循环扫描self.datesOnCalendar属性,self.currentDay = date;在将对象添加到数组之前执行时,该setCurrentDay:方法将返回,因为数组为空。currentDay将对象添加到数组后设置会导致我的方法setCurrentDay:陷入循环。

修复是将setCurrentDay:方法重命名为与属性设置器不冲突的方法currentDay,同时调整我的 for 循环。

于 2013-07-15T01:43:26.887 回答