1

首先,我为 NSString* 编写了我的自定义设置器,如下所示:

- (void)setDateString:(NSString *)newDateString {
    self.dateString = newDateString;
    NSInteger dateNumber = [dateString integerValue];
        // this line causes crash

    // do something here..blah blah
}

然后程序由于执行 [XXX setDateString:] 的无限多线程而停止。

经过几次无用的尝试后,我发现这个问题/答案告诉我

不要使用自我。在自定义访问器内部。直接访问变量,

所以我把我的代码变成了

- (void)setDateString:(NSString *)newDateString {
    //self.dateString = newDateString;
    dateString = newDateString;
    NSInteger dateNumber = [dateString integerValue];

    // do something here..blah blah
}

然后一切都像魅力一样!


我是一些客观语言的初级开发人员,也是 Objective-C 的新手。

我想详细了解这个问题,而不是在不了解原因的情况下解决问题。

因此,请为我提供一些材料/网站以了解更多有关此内容的信息。

顺便说一句,我使用 ARC。

谢谢你们。:)

4

3 回答 3

3

问题实际上不是这一行:

NSInteger dateNumber = [dateString integerValue];

就是这一行:

self.dateString = newDateString;

你看,等号类似于字面调用[self setDateString:newDateString](事实上,这是编译器重新解释它的),它会创建一个无限循环。自然,注释掉该行一开始就不会创建该循环。

于 2012-06-14T18:51:37.057 回答
3
self.dateString = newDateString;

相当于

[self setDateString:newDateString];

所以这将导致无限递归,因为你在里面调用它-setDateString:

另请参阅self.ivar 和 ivar 之间的区别?.

于 2012-06-14T18:51:54.527 回答
2

发生的事情是你一次又一次地调用函数,导致调用函数陷入溢出

错在这一行

self.dateString = newDateString;

这一行是一个客观的 c 属性,它有一个 getter 和 setters 方法,这些方法是在你 @synthesize 时自动生成的,dateString 的 setter 和 getters 方法是:

 - (void)setDateString:(NSString *)newDateString;

 - (NSString*)dateString;

所以当你调用self.dateString = newDateString; 这条线时会再次调用这个函数

- (void)setDateString:(NSString *)newDateString {

而这个函数又包含了self.dateString = newDateString;,你的调用栈会越来越深,直到你的堆栈存储空间不足

于 2012-06-14T18:52:29.007 回答