ivars 和循环方法
Posted
技术标签:
【中文标题】ivars 和循环方法【英文标题】:ivars and recurring methods 【发布时间】:2014-03-15 12:30:01 【问题描述】:我必须调用一个循环的方法,或者换句话说,该方法会调用自己。
同时,我必须有一个该方法将使用的控制变量。
首先我会考虑声明一个像 controlIndex
这样的 ivar 并在方法中使用它,如下所示:
// declared on .h
NSUInteger controlIndex;
// later on the program...
controlIndex = 100;
[self doItBaby];
...
- (void)doItBaby
NSArray *subNodes = [node children];
if ([subNodes count] == 0) return;
for (id oneNode in subNodes)
if ([oneNode isABomb])
[oneNode markNodeWithIndex:controlIndex];
controlIndex ++;
[self doItBaby];
这段代码可以完成这项工作,但我使用的是在主类标题上声明的这个 ivar。
我想知道是否有一种方法可以自行包含 controlIndex
变量,而不是在类头中使用那个变量。
【问题讨论】:
类扩展将是自我包含实现文件的变量的另一个选项。 如果变量只在这个方法中使用,他不应该创建一个类类别只是为了包含变量... 【参考方案1】:重构你的方法来接受一个论点。
- (void)doItBaby:(NSUInteger)controlIndex
NSArray *subNodes = [node children];
if ([subNodes count] == 0) return;
for (id oneNode in subNodes)
if ([oneNode isABomb])
[oneNode markNodeWithIndex:controlIndex];
controlIndex ++;
[self doItBaby:controlIndex];
您仍然需要向它发送一个初始值并在每次递归调用时重新发送controlIndex
变量,但您的初始值不必是整个类可见的实例变量。
[self doItBaby:100];
【讨论】:
【参考方案2】:在doItBaby
中声明static NSUInteger controlIndex
- (void)doItBaby
static NSUInteger controlIndex = 100;
【讨论】:
不工作。每次 doItBaby 运行时,变量都是 100……它没有被递增。 这是错误的,因为 OP 在递归方法中使用变量,并且每次调用该方法时都会重置静态变量 - See here以上是关于ivars 和循环方法的主要内容,如果未能解决你的问题,请参考以下文章
为啥在 init 方法中为 iVar 定义调用 autorelease?