0

所以我有一个任务实体类(核心数据),我试图覆盖它的一个字符串(timeIntervalString)的设置器,所以它可以显示在表格视图单元格的详细文本标签中。出于某种原因,我收到这样的 EXC_BAD_ACCESS 错误:

在此处输入图像描述

[Tasks timeIntervalString] 一直持续到 37355...

这是我的代码:

-(NSString *)timeIntervalString{

    NSUInteger seconds = (NSUInteger)round(self.timeInterval);
if ((seconds/3600) == 0){
    if (((seconds/60) % 60) == 1) {
        self.timeIntervalString = [NSString stringWithFormat:@"%u MIN", ((seconds/60) % 60)];
    } else {
        self.timeIntervalString = [NSString stringWithFormat:@"%u MINS", ((seconds/60) % 60)];
    }
} else if ([self.conversionInfo hour] == 1) {
    if (((seconds/60) % 60) == 0){
        self.timeIntervalString = [NSString stringWithFormat:@"%u HR", (seconds/3600)];
    } else if (((seconds/60) % 60) == 1) {
        self.timeIntervalString = [NSString stringWithFormat:@"%u HR %u MIN", (seconds/3600), ((seconds/60) % 60)];
    } else {
        self.timeIntervalString = [NSString stringWithFormat:@"%u HR %u MINS", (seconds/3600), ((seconds/60) % 60)];
    }
} else {
    if (((seconds/60) % 60) == 0) {
        self.timeIntervalString = [NSString stringWithFormat:@"%u HRS ", (seconds/3600)];
    } else if (((seconds/60) % 60) == 1){
        self.timeIntervalString = [NSString stringWithFormat:@"%u HRS %u MIN", (seconds/3600), ((seconds/60) % 60)];
    } else {
        self.timeIntervalString = [NSString stringWithFormat:@"%u HRS %u MINS", (seconds/3600), ((seconds/60) % 60)];
    }
}
return self.timeIntervalString;

}

有任何想法吗?

4

1 回答 1

5

return self.timeIntervalString只会递归调用相同的timeIntervalString方法。

你可能想要的是return _timeIntervalString.

解释:self.timeIntervalString是属性访问器语法糖,它和 是一样的[self timeIntervalString],它会调用-(NSString *)timeIntervalString你在这里定义的方法。return _timeIntervalString更改将使您直接访问实例变量,而不是递归调用属性访问器。这是您在编写的任何自定义属性访问器方法中都应该遵循的一般模式。

编辑:根据评论中的讨论,最好将其标记为只读属性并且从不实际设置值:

在您的 .h 文件中:

@property (readonly) NSString *timeIntervalString;

在您的 .m 文件中:

-(NSString *)timeIntervalString {
    NSString *value;
    // insert here the body of your timeIntervalString method, as you
    // originally wrote it, but replace all occurences of:
    // self.timeIntervalString = ...
    // with this: value = ...
    return value;
}
于 2013-08-01T19:03:03.683 回答