NSMenu - 在循环菜单中的项目时从菜单中删除项目

时间:2012-07-25 03:06:50

标签: objective-c for-loop osx-lion nsmenu

我可以编写如下代码吗?它似乎有效,但我想确保它是允许/安全的:

// menu is a NSMenu*
for (NSMenuItem *item in [menu itemArray]) {
    if (some condition) {
        [menu removeItem:item];
    }
}

2 个答案:

答案 0 :(得分:0)

如果它没有立即抛出异常(因为在枚举它时直接修改数组)那么它可能没问题。 NSMenu可能会给你一个内部数组的副本(假设它的项目保留在NSArray中)。

但为了确保安全,您可能需要分两步完成此操作。创建另一个数组来保存要删除的项目,然后枚举那个并执行删除:

NSMutableArray * itemsToRemove = [NSMutableArray array];
for( NSMenuItem *item in [menu itemArray] ){
    if( some condition ){
        [itemsToRemove addObject:item];
    }
}

for( NSMenuItem * item in itemsToRemove ){
    [menu removeItem:item];
}

答案 1 :(得分:0)

仅供记录: 如果你关心内存并且不想创建二级数组,请使用:

for (int i = menu.itemArray.count - 1; i >= 0; --i)
{
    if( some condition for index i ){
        [menu removeItemAtIndex:i];
    }
}