Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 在自定义setter中使用NSString会导致无限线程_Objective C_Ios_Cocoa - Fatal编程技术网

Objective c 在自定义setter中使用NSString会导致无限线程

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 } 然后

首先,我为NSString*编写了自定义setter,如下所示:

- (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。是的,它们是堆叠的。谢谢大家!我有了更好的理解。谢谢大家!我得到了更好的理解。