Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xcode/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 如何在“上设置断点”;objectAtIndex:“;XCode 4中特定类中特定属性的方法?_Objective C_Xcode_Xcode4_Breakpoints - Fatal编程技术网

Objective c 如何在“上设置断点”;objectAtIndex:“;XCode 4中特定类中特定属性的方法?

Objective c 如何在“上设置断点”;objectAtIndex:“;XCode 4中特定类中特定属性的方法?,objective-c,xcode,xcode4,breakpoints,Objective C,Xcode,Xcode4,Breakpoints,我想在特定类中特定属性的“objectAtIndex:”方法上设置一个符号断点 请参阅以下代码: @interface Foo ... @property (strong,nonatomic) NSMutableArray *fooArray; ... @end 我试过以下几件事: -[[Foo fooArray]objectAtIndex: -[Foo::fooArray objectAtIndex: -[Foo::fooArray objectAtIndex] Foo::fooArray

我想在特定类中特定属性的“objectAtIndex:”方法上设置一个符号断点

请参阅以下代码:

@interface Foo
...
@property (strong,nonatomic) NSMutableArray *fooArray;
...
@end
我试过以下几件事:

  • -[[Foo fooArray]objectAtIndex:
  • -[Foo::fooArray objectAtIndex:
  • -[Foo::fooArray objectAtIndex]
  • Foo::fooArray::objectAtIndex:
  • Foo::fooArray::objectAtIndex
  • Foo::fooArray::objectAtIndex()
这些解决方案都不起作用


有什么办法吗?

我不在Mac电脑上,所以我自己无法尝试,但是:

breakpoint set -n "-[[Foo fooArray] objectAtIndex:]" 

不幸的是,尽管这会很有用,但由于多种原因,它无法工作

第一个涉及如何指定方法。用于在断点中标识方法的方法签名由三部分组成:

-¹[NSDictionary² objectForKey:³]
+¹[NSString² stringWithContentsOfURL:encoding:error:³]
  • 这是实例方法(-)还是类方法(+)
  • 该方法的哪个类的实现
  • 这个方法的选择器是什么
  • 所以你的第一个问题是你为#2写的东西不是一门课

    您拥有的是一个类,以某种方式后跟属性名。这无法工作,因为调试器无法知道这是否是纯访问器。它无法确保您或实现该属性的人没有编写执行其他操作的自定义访问器。这意味着调试器没有好的、可靠的方法来获取该值,或者知道该值何时更改,而不会产生潜在的副作用

    此外,类在方法签名中的作用是识别哪个类提供了要设置断点的实现。当您开始尝试引用一个包含对象的属性时,它就消失了,因为调试器需要一个类,并且必须从对象中获取该类,并查看上一段,以了解在任何时候都知道哪个对象是什么样的困难

    (公平地说,调试器确实可以监视实例变量IIRC的值,两个调试器都可以在一个观察点中执行此操作,尽管我上次尝试观察点时观察点的可靠性很差。如果调试器可以将属性转换为其支持ivar,如果它有一个,并注意这一点,那么它将是一个decent 90%解决方案适用于大多数属性,这些属性没有富有想象力的存储实现和自定义访问器的支持。但调试器现在无法做到这一点。)

    第二个原因是NSArray是一个类集群

    您可能已经知道了第一部分(我想这就是您试图通过另一个对象的属性指定单个对象的原因):

    NSArray和NSMutableArray都是抽象类,这反过来意味着它们都没有实现作为数组的业务;每一个都实现了一组方便的方法,而留下一组选定的核心方法未实现,供子类实现

    因此,当您创建NSArray时,您不会创建NSArray。您返回的对象将是NSArray的某个私有子类的实例,它自己实现了如何管理有序对象列表的所有细节

    因此,您可以在,
    -[NSArray objectAtIndex:
    上设置断点,但它永远不会被击中,因为没有任何东西使用NSArray的
    objectAtIndex:
    的实现-使用该实现没有意义,因为该实现会引发异常(旨在捕获忘记实现它的子类)

    打破你问题的部分是:

    虽然NSArray的各种非基本方法的实现最终是根据核心方法定义的,例如
    objectAtIndex:
    ,但这并不意味着子类必须使用这些实现。如果
    objectA,子类很可能有自己的实现,而不使用
    objectAtIndex:
    tIndex:
    不是执行这些操作的最有效方法(例如,如果数组由链表而不是C数组支持)

    因此,总结一下这个冗长的答案:

    • 调试器无法可靠地监视属性的值
    • 因此,当调用作为该属性值的对象类中的方法时,调试器不可能中断,因为设置断点的正确方法可能随时更改,调试器无法知道何时会发生这种情况
    • 即使您可以中断由属性标识的某些对象的
      objectAtIndex:
      ,数组也可能永远不会有效地使用
      objectAtIndex:
      ,在这种情况下,您的断点无论如何也不会被命中

    你可能应该通过打开
    objectAtIndex:
    来问另一个问题,不管你想做什么。我想你是在调查应用程序中的一个bug;这个bug可能是另一个有趣的问题。

    经过一些挖掘,我找到了解决这个问题的方法。这有点难看

    它涉及在由第一个断点触发的命令中动态创建条件断点

    首先,在fooArray准备就绪时中断。我决定使用
    fooArray
    访问器,但可以提前完成:

    
    断点集--名称“-[Foo fooArray]”
    

    然后,当对这个特定数组对象调用
    objectAtIndex:
    时,您需要的是中断

    
    expr id$watch=self->\u fooArray
    

    然后在条件中使用此变量创建一个新断点:

    
    断点集--名称“-[\u NSArrayI objectAtIndex:]”--条件“$rdi==$watch”
    

    • $rdi
      至少在