Objective-C:改变自身属性的递归方法

Posted

技术标签:

【中文标题】Objective-C:改变自身属性的递归方法【英文标题】:Objective-C: Recursive method that changes property of self 【发布时间】:2013-06-05 21:47:49 【问题描述】:

我有一个递归方法可以改变 self 的属性(定义方法的对象)。

我收到错误:

...未捕获的异常 'NSGenericException',原因:'*** Collection <__nsarraym:> 在枚举时发生了变异...'

我阅读了有关此错误的信息,但我不确定如何对我的问题应用解决方案。递归对于解决方案至关重要,更新此特定属性也是如此。我对 Objective-C 很陌生,所以我可能遗漏了一些东西或者设计这个解决方案很糟糕。

currentPlayer 是财产 recursiveMethod 显然是产生错误的递归方法

for in 循环中调用此递归方法。

    - (void) recursiveMethod:(id <Team>)team atIndex:(int *)i withPlayer:(id <Player>) 
        [self.currentPlayer replaceObjectAtIndex:i withObject:nextPlayer];
        if // some conditional that's unimportant to this question 
        
            // grab another team
            // grab another index
            // grab another player
            [self recursiveMethod:nextTeam atIndex:i withPlayer:nextPlayer];
         
    

很多细节并不重要。我把它剥掉了;实际上它只是一个递归方法,它将更新定义该方法的对象的属性(在本例中为数组)。

【问题讨论】:

哇。看看我在谷歌上搜索到的确切的错误消息:***.com/questions/10157381/… GuillaumeA 指出的答案说您可以通过自己迭代来避免错误。但是,在代码示例中,您展示的正是您正在做的事情 - 对数组的递归修改。所以你必须有一个枚举(例如for in),你在其中调用recursiveMethod 【参考方案1】:

只需阅读异常消息:

NSArrayM [...] 在枚举时发生了变异。

你不能这样做。

【讨论】:

谢谢,很有帮助。真的很感激。 @codework 如果你真的需要修改数组,那么mutableCopy它并在枚举完成后设置它,这样它就不会崩溃(它会有意义:)跨度> 是的,CRD,你是对的。我的错误是未能将其包含在我的原始代码示例中。这是一个在for in 循环中调用的递归函数。

以上是关于Objective-C:改变自身属性的递归方法的主要内容,如果未能解决你的问题,请参考以下文章

递归,尾递归,回溯

算法笔记----递归算法

递归的原理

Objective-C

JQUERY组装对象并调用自身函数改变自己的属性

JS的深拷贝和浅拷贝