xcode 3.2.2和objective-C2.0以及调试:我的对象在哪里;调试中的属性/实例变量值?

xcode 3.2.2和objective-C2.0以及调试:我的对象在哪里;调试中的属性/实例变量值?,objective-c,xcode,cocoa,xcode3.2,Objective C,Xcode,Cocoa,Xcode3.2,在一个需要10.6且64位的mac os项目(不是iPhone)上工作,允许我使用属性在头文件中生成访问器方法和实例变量。但是,在调试期间,我不知道如何在填充对象的属性值之后查看它们。是否需要打开某些生成设置 如果我正在声明一个对象的实例变量(在头中的{}之间),那么我可以在调试期间在调试窗口本身中看到这些值(使用时),或者在中断期间使用光标悬停在编辑器中突出显示的行技巧上,或者在gdb中执行cli,例如“p*object” 老办法: @class Suit; @interface Card :

在一个需要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)采购订单新卡
新卡:0张套装:红心(NSCalibratedRGBColorSpace 1 0 1)。orderIndex为:1
(gdb)p*新卡
$1 = {
= {
isa=0x10000218
}, 
信用卡会员:
播放顺序=0x0,
套装=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) 
(gdb)采购订单新卡
新卡:0张套装:红心(NSCalibratedRGBColorSpace 1 0 1)。orderIndex为:1
(gdb)p*新卡
$3 = {
= {
isa=0x10000218
}, }
(gdb)
因此,看看objective-C2.0的文档:

描述了我所指的内容(在“现代”运行时中合成实例变量),但没有提到的是,如果您这样做,那么这些值在调试期间将不可用

我发现了一个包含相关信息的SO页面,但并未关注此效果:


我错过了什么?

我假设您正在合成这些变量

您可能还需要在接口中使用
{}
,以便编译器知道将其放置在何处

@interface Card : NSObject
{

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

另外,查看
,看看是否可以打印该类的IVAR列表。我一直在使用下面的代码调试没有文档的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
    }
unsigned int total\u method\u count=0;
方法*Method\u list=class\u copyMethodList(object\u getClass([obj class]),&total\u方法\u计数);
@试一试
{
int方法_计数器=0;
对于(方法计数器=0;方法计数器<总方法计数;方法计数器++)
{
方法=方法列表[方法计数器];
//检查方法是否是您感兴趣的KVC getter
NSLog(@“方法:%s”,sel_getName(方法_getName(方法));
}
}@catch(n例外*e){
//无所事事
}

在GDB中,您可以使用属性获取程序访问动态IVAR:

(gdb) po [newCard displayNumber] 0 (gdb)采购订单[新卡显示编号] 0
我对合成IVAR也有同样的问题。我的解决方案是切换到XCode 3.25中的LLVM 1.6编译器。这带来了调试器工具提示(对我最有帮助),但变量窗口仍然无法显示IVAR。

是否可能已打开garbace集合?尝试将其关闭,然后查看调试器是否在字段上拾取。是的,两个示例测试中的垃圾收集都处于启用状态。是的,.m文件在两个示例中的属性都具有@synthesis。至于在第二个例子中使用“{}”,我的想法是,如果一个项目被设置为64位,并且需要10.6才能运行,那么就可以合成实例变量,{}是不必要的。因此,我非常惊讶地发现在调试中没有数据可供使用,所以我肯定出了什么问题。我会试试你的代码,然后再报告。谢谢,stephen。我可以看出上面的想法在哪些方面会有所帮助,以及在调试中使用运行时头函数作为一种策略,并且可能也会帮助其他人。我想问的是,如果我在创建64位、10.6运行时的项目时使用合成IVAR,那么我看不到调试数据引用,对我来说,这看起来很奇怪,(无法使用gdb或xcode调试),我确信我的设置中缺少了一些东西。这就是我问题的基础:“我遗漏了什么?”我所引用的只是编译器可能根本没有生成IVAR这一事实。因此,您应该使用运行时来确保生成它们,而不仅仅依赖于(gdb)或XCode调试器。另外,由于编译器没有做任何智能化的工作,您可能需要添加
{}
,以确保编译器知道将代码放在哪里。不幸的是,我只能帮你这么多。如果你不能在运行时.h中看到你的IVAR,那么“新”方法只是一堆马马虎虎的把戏,你无论如何都不应该使用那样的“隐形”语法。很抱歉,过了一段时间才回复你。谢谢你的建议。我已经更改了我的“真实”项目,添加回{}。我在使用这本书:《可可与目标:启动与运行》,作者在他的例子中使用了这一思想,但是这本书没有涵盖gdb.outis,谢谢你的回答。这正是我需要的。我一直认为我应该使用newCard.displayNumber(注意点语法),当这不起作用时,我应该使用p*newCard,并从结果开始。然后我被困在那里,看不到任何有用的结果。