黑马程序员技术交流社区

标题: 关于OC self 死循环这事 [打印本页]

作者: 周易    时间: 2014-8-12 22:18
标题: 关于OC self 死循环这事
看了视频中所讲了,但还不是很理解这个死循环,为什么输出,永远都是 用了test方法而不停止。求指点
#import <Foundation/Foundation.h>
@inteface Person : NSObject
-(void)test;
@end
@implementation Person
-(void)test;
{
        NSLog(@"用了test方法");
        [self test];
}
@end
int main()
{
        Person *p = [Person new];
        [p test];
        return 0;
}
作者: ★Joean_Zhou    时间: 2014-8-13 08:44
因为[p test]就是调用test方法,之后来到
-(void)test;   //这里不应该有分号
{
        NSLog(@"用了test方法");  // 输出结果

        [self test];   //这句有相当于当前对象(person对象)又调用test方法,又回到了test方法的入口,反反复复

}
作者: cjfire    时间: 2014-8-13 09:15
  1. [self test];
复制代码

死循环的原因在这里,一旦调用了test方法后,就不断的调用test,有点递归的味道。只是没有判断语句。
作者: 寇亮    时间: 2014-8-13 09:26
     执行  [p test];  会有以下动作 ——>
     {NSLog(@"用了test方法"); [p test]; }   ——>
     {NSLog(@"用了test方法");NSLog(@"用了test方法"); [p test];}  ——>
     {NSLog(@"用了test方法");NSLog(@"用了test方法");NSLog(@"用了test方法"); [p test];}  ——>
     {NSLog(@"用了test方法");NSLog(@"用了test方法");NSLog(@"用了test方法"); ......  [p test];}   ——>
     ......
作者: fxc    时间: 2014-8-13 09:32
[self test]表示调用当前对象的test方法    但是一旦调用test方法     又执行[self test]    就这样不断调用test方法    不断执行[self test]    ……就形成死循环。楼主如果还不明白可以将视频反复看几遍,敲一敲代码
作者: x65396731    时间: 2014-8-13 11:01
本帖最后由 x65396731 于 2014-8-13 11:05 编辑

-(void)test;
{
        NSLog(@"用了test方法");
        [self test];
}

这个是调用当前对象的test函数,然后继续调用当前的test函数。。。。

我的理解是绝对不能在函数或者方法里用self里调用和同名的函数和方法,这样就会出现死循环。

作者: 陆习康    时间: 2014-8-13 16:34
既然楼上的几个都说的那么清楚了,我也不再捣鼓了。先执行:NSLog,打印结果,[self test]:调用test方法,执行NSLog,继续打印,调用[self test]方法,执行NSLog ,继续打印,没玩没了




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2