Objective c 在自定义setter中使用NSString会导致无限线程
首先,我为NSString*编写了自定义setter,如下所示:Objective c 在自定义setter中使用NSString会导致无限线程,objective-c,ios,cocoa,Objective C,Ios,Cocoa,首先,我为NSString*编写了自定义setter,如下所示: - (void)setDateString:(NSString *)newDateString { self.dateString = newDateString; NSInteger dateNumber = [dateString integerValue]; // this line causes crash // do something here..blah blah } 然后
- (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语言的初级开发人员,也是objective-C的新手 我想详细了解这个问题,而不是在不了解原因的情况下解决问题 因此,请向我提供一些资料/网站,以了解更多有关这方面的信息 顺便说一句,我用圆弧
谢谢大家。:) 问题不在于这一行:
NSInteger dateNumber = [dateString integerValue];
self.dateString = newDateString;
这是一条线:
NSInteger dateNumber = [dateString integerValue];
self.dateString = newDateString;
你看,等号类似于字面上调用
[self-setDateString:newDateString]
(事实上,编译器将其重新解释为)从而创建一个无限循环。很自然,注释掉这一行从一开始就不会产生循环。问题其实不是这一行:
NSInteger dateNumber = [dateString integerValue];
self.dateString = newDateString;
self.dateString = newDateString;
这是一条线:
NSInteger dateNumber = [dateString integerValue];
self.dateString = newDateString;
你看,等号类似于字面上调用[self-setDateString:newDateString]
(事实上,编译器将其重新解释为)从而创建一个无限循环。当然,注释掉这一行从一开始就不会创建这个循环
self.dateString = newDateString;
相当于
[self setDateString:newDateString];
因此,这将导致无限递归,因为您在-setDateString:
内调用它
另见
相当于
[self setDateString:newDateString];
因此,这将导致无限递归,因为您在-setDateString:
内调用它
另请参见。发生的情况是,您不断地反复调用函数,导致调用函数陷入停滞状态 这条线怎么了
self.dateString = newDateString;
这行是一个objective c属性,它有一个getter和setters方法,这些方法在@synthesis时自动生成
dateString的setter和getter方法是:
- (void)setDateString:(NSString *)newDateString;
及
因此,当您调用self.dateString=newDateString代码>
此行将再次调用此函数
- (void)setDateString:(NSString *)newDateString {
此函数再次包含self.dateString=newDateString代码>,您的调用堆栈将越来越深,直到超出堆栈存储发生的情况是,您不断地调用函数,导致调用函数陷入堆栈溢出
这条线怎么了
self.dateString = newDateString;
这行是一个objective c属性,它有一个getter和setters方法,这些方法在@synthesis时自动生成
dateString的setter和getter方法是:
- (void)setDateString:(NSString *)newDateString;
及
因此,当您调用self.dateString=newDateString代码>
此行将再次调用此函数
- (void)setDateString:(NSString *)newDateString {
此函数再次包含self.dateString=newDateString代码>,您的调用堆栈将越来越深,直到超出堆栈存储。请注意,这些不是线程。这些是堆栈帧,与线程非常不同。你说得对!!我想知道为什么它会在几个线程中执行setter。是的,它们是堆栈。请注意,这些不是线程。这些是堆栈帧,与线程非常不同。你说得对!!我想知道为什么它会在几个线程中执行setter。是的,它们是堆叠的。谢谢大家!我有了更好的理解。谢谢大家!我得到了更好的理解。