【问题标题】:"Single stepping until exit from function objc_exception_throw, which has no line number information." when using enumeration in objective c“单步执行直到退出函数 objc_exception_throw,它没有行号信息。”在目标 c 中使用枚举时
【发布时间】:2012-03-01 07:16:36
【问题描述】:

我发现了一个引发相同异常的类似问题,但它没有帮助。无人接听:Getting "Single stepping until exit from function CALayerGetDelegate, which has no line number information." in iphone sdk

程序为aa+a+时的示例参数

当参数程序再次调用方法时导致中断的示例参数是aa+a+a。为什么?

这是我的代码:

+(NSSet *)variablesUsedInsideProgram:(id)program
{

    NSMutableSet *variablesUsed = [NSMutableSet setWithArray:program];
    //put the program into a mutable set then pop off everything else that is !a,!b,!c

    id objectReferenceFromVariablesUsed = nil;
    for(objectReferenceFromVariablesUsed in variablesUsed) //breaks here
    {
        if (!([objectReferenceFromVariablesUsed isEqual:@"a"] | [objectReferenceFromVariablesUsed isEqual:@"b"] | [objectReferenceFromVariablesUsed isEqual:@"c"]))
        {
            [variablesUsed removeObject:objectReferenceFromVariablesUsed];
        }
    }
    return [variablesUsed copy];
}

DEBUG 打印出我得到的语句:

(gdb) po program<__NSArrayI 0x68a7a00>(a,a,+,a,+,a)

所以我知道我的程序推入了变量a

(gdb) po variablesUsed
{(
    "+",
    a
)}

添加到 NSMutableSet 时程序中的唯一值

我知道正在发生的事情:

objectReferenceFromVariablesUsed = +,然后从 Set 中弹出

(gdb) po variablesUsed {( a )}

回到循环然后中断。获取错误消息“单步执行直到从函数 objc_exception_throw 退出,该函数没有行号信息。Catchpoint 2(抛出异常)。

有人知道是什么原因造成的吗?

【问题讨论】:

标签: objective-c exception enumeration


【解决方案1】:

原始答案(以及 Walt 的有用评论):

您在枚举时修改集合

这在 Objective-C 的快速枚举中是不允许的。 – Walt Sellers 3 月 1 日 8:22


更新:

该怎么做:

更好的方法是将应该删除的对象添加到新集合中,并通过使用-minusSet:(以下文档)删除新集合中的所有对象来更新原始对象。请注意文档中的对象已就地删除返回一个新集合)。

减组:

从接收集中删除另一个给定集中的每个对象(如果存在)。

- (void)minusSet:(NSSet *)otherSet

参数

其他设置

要从接收集中移除的对象集。


实际实现(修改你的代码)

要删除所有不是“a”、“b”或“c”的对象,您首先需要创建一个新的 NSMutableSet (objectsToBeRemoved) 来添加应该删除的对象。在枚举原始集合 (variablesUsed) 并找到应该删除的对象时,将其添加到新集合 (objectsToBeRemoved)。枚举完成后,通过计算原始集合减去要移除的对象集合来移除所有应该移除的对象。

+(NSSet *)variablesUsedInsideProgram:(id)program
{
    NSMutableSet *variablesUsed = [NSMutableSet setWithArray:program];
    //put the program into a mutable set then pop off everything else that is !a,!b,!c
    
    NSMutableSet *objectsToBeRemoved = [[NSMutableSet alloc] init];
    
    id objectReferenceFromVariablesUsed = nil;
    for(objectReferenceFromVariablesUsed in variablesUsed)
    {
        if (!([objectReferenceFromVariablesUsed isEqual:@"a"] || 
              [objectReferenceFromVariablesUsed isEqual:@"b"] || 
              [objectReferenceFromVariablesUsed isEqual:@"c"]))
        {
            [objectsToBeRemoved addObject:objectReferenceFromVariablesUsed];
        }
    }
    
    return [[variablesUsed minusSet:objectsToBeRemoved] copy];
}

【讨论】:

  • 这在 Objective-C 的快速枚举中是不允许的。
【解决方案2】:

已修复!

+(NSSet *)variablesUsedInsideProgram:(id)program {

NSMutableSet *variablesUsed = [NSMutableSet setWithArray:program];
NSMutableSet *variablesUsed1 = [NSMutableSet setWithArray:program]; **//HERE**
//put the program into a mutable set then pop off everything else that is !a,!b,!c

id objectReferenceFromVariablesUsed = nil;
for(objectReferenceFromVariablesUsed in variablesUsed) //breaks here
{
    if (!([objectReferenceFromVariablesUsed isEqual:@"a"] | [objectReferenceFromVariablesUsed isEqual:@"b"] | [objectReferenceFromVariablesUsed isEqual:@"c"]))
    {

        [variablesUsed1 removeObject:objectReferenceFromVariablesUsed];
    }
}
return [variablesUsed1 copy];

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-18
    • 1970-01-01
    • 2014-05-10
    相关资源
    最近更新 更多