面试题答案
一键面试- break和continue对外部循环的影响:
- 在Objective - C中,在block内部循环中使用
break
和continue
关键字,它们只会影响block内部的循环,不会直接影响外部循环。这是因为block有自己独立的作用域,block内部的控制流语句仅作用于其自身内部的循环结构。
- 在Objective - C中,在block内部循环中使用
- 让block内的break和continue影响外部循环的设计与实现:
- 方法一:使用__block变量
- 原理:通过定义一个
__block
类型的变量来标记是否需要中断或继续外部循环,在block内部修改这个变量,然后在外部循环中根据这个变量的值来决定是否继续或中断循环。 - 代码示例:
- 原理:通过定义一个
- 方法一:使用__block变量
__block BOOL shouldBreak = NO;
for (int i = 0; i < 10; i++) {
void (^block)(void) = ^{
if (i == 5) {
shouldBreak = YES;
}
};
block();
if (shouldBreak) {
break;
}
}
- 方法二:使用Goto语句(不推荐,代码可读性差)
- 原理:在block内部设置一个标记,然后在外部循环中使用
goto
语句跳转到特定位置,以实现类似break
或continue
的效果。 - 代码示例:
- 原理:在block内部设置一个标记,然后在外部循环中使用
for (int i = 0; i < 10; i++) {
__block BOOL shouldContinue = NO;
void (^block)(void) = ^{
if (i == 5) {
shouldContinue = YES;
}
};
block();
if (shouldContinue) {
continue;
}
// 这里假设要实现类似break的效果,可以通过goto语句实现
__block BOOL shouldBreak = NO;
void (^block2)(void) = ^{
if (i == 7) {
shouldBreak = YES;
}
};
block2();
if (shouldBreak) {
goto endLoop;
}
}
endLoop:;
- 方法三:使用自定义逻辑判断
- 原理:将block的返回值作为判断条件,在外部循环中根据返回值决定是否继续或中断循环。
- 代码示例:
for (int i = 0; i < 10; i++) {
BOOL (^block)(void) = ^{
if (i == 5) {
return NO;
}
return YES;
};
if (!block()) {
break;
}
}
在实际应用中,使用__block
变量或者自定义逻辑判断的方式更为推荐,因为它们能保持代码的可读性和逻辑性,而goto
语句虽然能实现功能,但会使代码结构变得混乱,不易维护。