8

在需要 10.6 并且是 64 位的 mac os 项目(不是 iPhone)上工作,允许我使用属性在头文件中生成访问器方法和实例变量。但是,在调试期间,我没有看到在填充对象的属性值后如何查看它们。是否需要打开一些构建设置?

如果我声明一个对象的实例变量(在标题中的 {} 之间),那么我可以在调试期间在调试窗口本身中看到这些值(当它们被使用时),或者通过使用光标悬停在突出显示的行技巧上在休息期间在编辑器中,或者在 gdb 中执行 cli,例如 'p *object'。

老办法:

@class Suit;
@interface Card : NSObject 
{
    NSNumber *playOrder;
    Suit *suit;
    NSNumber *displayNumber;
    NSNumber *orderIndex;
}
@property(nonatomic, retain) Suit *suit;
@property(nonatomic, retain) NSNumber *displayNumber;
@property(nonatomic, retain) NSNumber *orderIndex;

新方法:

@class Suit;
@interface Card : NSObject 

@property(nonatomic, retain) Suit *suit;
@property(nonatomic, retain) NSNumber *displayNumber;
@property(nonatomic, retain) NSNumber *orderIndex;
@property(nonatomic, retain) NSNumber *playOrder;

在这个新奇的 10.6 需要 64 位的想法(这对我来说似乎更简单)中,这些调试方法都没有显示对象的值。我认为我必须关闭某些东西,因为这个较新的想法似乎并不好。

旧方式的 gdb 结果:

(gdb) po newCard
New Card : 0 of Suit : Hearts (NSCalibratedRGBColorSpace 1 0 0 1). with orderIndex of: 1
(gdb) p *newCard
$1 = {
  <NSObject> = {
    isa = 0x100002188
  }, 
  members of Card: 
  playOrder = 0x0, 
  suit = 0x200053a20, 
  displayNumber = 0x20001bac0, 
  orderIndex = 0x200012de0
}
(gdb)

新方法的 gdb 结果:

(gdb) po newCard
New Card : 0 of Suit : Hearts (NSCalibratedRGBColorSpace 1 0 0 1). with orderIndex of: 1
(gdb) p *newCard
$3 = {
  <NSObject> = {
    isa = 0x100002188
  }, <No data fields>}
(gdb) 

所以查看objective-c 2.0的文档:

http://developer.apple.com/mac/library/documentation/Cocoa/Conceptual/ObjectiveC/Articles/ocProperties.html#//apple_ref/doc/uid/TP30001163-CH17-SW3

描述了我所指的内容(在“现代”运行时中合成实例变量),但在任何地方都没有说的是,如果你这样做,这些值在调试期间将不可用。

我找到了一个包含相关信息的SO页面,但没有关注这种效果: Using instance variables with Modern Runtime

我错过了什么?

4

3 回答 3

2

我假设你是@synthesizing那些变量?

您可能还需要{ }在接口中,以便编译器知道将它放在哪里。

@interface Card : NSObject
{

}

我会避免这种语法......特别是如果您自己定义属性。

另外,查找<objc/runtime.h>并查看是否可以打印该类的 ivars 列表。我一直使用以下方法从没有文档的 API 调试方法或类。

    unsigned int total_method_count = 0;
    Method * method_list = class_copyMethodList(object_getClass([obj class]), &total_method_count);
    @try
    {
        int method_counter = 0;
        for (method_counter = 0; method_counter < total_method_count; method_counter++)
        {
            Method method = method_list[method_counter];
            // check if method the KVC getter you are interested in
            NSLog(@"Method: %s", sel_getName(method_getName(method)));
        }
    } @catch (NSException *e) {
        //Do Nothing
    }
于 2010-06-10T11:45:19.107 回答
2

在 GDB 中,您可以使用属性 getter 访问动态 ivars:

(gdb) po [新卡显示编号]
0
于 2010-11-19T03:09:29.163 回答
2

我对合成的 ivars 也有同样的问题。我的解决方案是切换到 XCode 3.25 中的 LLVM 1.6 编译器。这带回了调试器工具提示(对我最有帮助),但变量窗口仍然无法显示 ivars。

于 2011-01-24T20:25:05.790 回答