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?

ivar 在 ARC 下发布 - 我如何保留它以用于另一种方法?

java编程题

runtime获取对象所有属性(变量)和方法

每个 ivar 都必须是一个属性吗?

@property 的本质是什么?