黑马程序员技术交流社区

标题: 关于NSArray遍历问题。老师的代码是不是有问题 [打印本页]

作者: 王庆功    时间: 2014-9-19 11:57
标题: 关于NSArray遍历问题。老师的代码是不是有问题
老师在讲Foundation中的NSArray的遍历时,以下代码有问题。

首先这是NSArray * array = @[@"Jack",@"Rose"];
这是在调用系统体提供的对象函数遍历
[array enumerateObjectsUsingBlock:^(id obj,NSUInteger idx,BooL *stop)
{
NSLog(@"%ld - %@",idx,obj);
}
-------0-------if(idx == 0)
break;

];

以下是老师在讲述上述代码的原理:
--------1---------void ^(myblock)(id,NSUInteger,BOOL *) = ^(id obj,NSUInteger idx,BOOL * stop){
NSLog(@"%ld -%@",idx,obj);

------0-------if(idx == 0)
*stop =YES;

};

for(int i = 0;i < array.count;i++){
        BOOL isStop = NO;
        id obj = array[i];
       
        myblock(obj,i,isStop);
        if(isStop)
        break;

}

首先,void ^(myblock)(id,NSUInteger,BOOL *)中的^应该在()里面,老师写错了,却视频中却没报错,我找了半天才找出来。

其次,就是老师在讲解对象方法的原理时都是在他自己的假设“i==0时就停止打印下”讲解的。如果没有这个假设,那stop的值应该在i=array.count时变成YES,但是在Block中根本就无法使用array这个数组,除非再用一个形参传递数组长度。
OC初学者,也可能是我自己想的不到位,求牛人解释。
作者: fantacyleo    时间: 2014-9-19 12:06
你的block中不用关心什么时候到array.count,这个问题由NSArray的其他代码代劳了。这叫模板设计模式,整个程序逻辑的大框架写好了,你只需要填一些空就可以让体系运转起来
作者: 王庆功    时间: 2014-9-19 12:24
fantacyleo 发表于 2014-9-19 12:06
你的block中不用关心什么时候到array.count,这个问题由NSArray的其他代码代劳了。这叫模板设计模式,整个 ...

那请问NSArray的其他代码是什么?或者说下怎么样停止的
作者: fantacyleo    时间: 2014-9-19 12:48
王庆功 发表于 2014-9-19 12:24
那请问NSArray的其他代码是什么?或者说下怎么样停止的

苹果又不开源Foundation框架,我不可能知道具体代码怎么写。但大致的原理不难理解,就是你主帖里贴出来的那段“老师在讲述上述代码的原理”啊
作者: x65396731    时间: 2014-9-19 13:57
我觉得没写错,老师的意思void ^(myblock)(id,NSUInteger,BOOL *) 等于^(id obj,NSUInteger idx,BOOL * stop)
这不是一段代码,他其实是想用来解释后面的*stop为什么需要传地址的,具体怎么做,老实说我也没搞懂,就是弄了个内部循环来实现的,至于里面的完整过程,就像上面说的是Foundation源代码,不可能给你看的。
作者: ★彬★卍囧神    时间: 2014-9-19 15:32
我懂你的意思你的意思是array【0】怎么都会被打印出来,老师这里教的原理,可能没太注意




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