2010-06-03 26 views
8

工作在需要10.6和64位的mac os項目(意思不是iPhone)上,允許我使用屬性在頭文件中生成存取器方法和實例變量。但是,在調試過程中,我看不到如何在填充後查看對象的屬性值。是否有一些需要打開的構建設置?Xcode 3.2.2和Objective-C 2.0和調試:在調試中,我的對象的屬性/實例變量值在哪裏?

如果我正在聲明一個對象的實例變量(在標題中的{}之間),那麼我可以在調試窗口本身中的調試過程中看到這些值(當它們被使用時),或者通過使用光標懸停例如,休息時在編輯器中突出顯示的線條技巧,或者通過在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

描述我所指的(在'modern'中綜合實例變量無用的),但是在任何地方都沒有說過,如果你這樣做,這些值在調試過程中將不可用。

我已經找到了相關信息的SO頁面,而不是專注於這個效果: Using instance variables with Modern Runtime

我錯過了什麼?

+0

你有可能打開了garbace收藏嗎?嘗試將其關閉,然後查看調試器是否在字段中選擇。 – 2010-06-10 07:48:24

+0

在兩個示例測試中都有垃圾回收。 – lulu 2010-06-11 01:06:08

回答

2

在GDB,您可以使用屬性的getter來訪問動態的ivars:

 
(gdb) po [newCard displayNumber] 
0 
+0

outis,謝謝你的回答。這實際上是我需要的。我一直在想,我應該使用newCard.displayNumber(注意點語法),當它不起作用時,我應該使用p * newCard,然後從該結果開始。然後我被卡住沒有看到任何可用的結果。 – lulu 2010-11-24 13:12:53

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 
    } 
+0

是的,.m文件在兩個示例中都具有@synthesize屬性。 至於在第二個例子中使用'{}',我使用的想法是,如果一個項目設置爲64位,需要10.6運行,那麼實例變量可以合成,'{}'是不必要。因此我非常驚訝地發現沒有數據用於調試,所以確定我有什麼問題。 我會嘗試你的代碼並回報。 謝謝,斯蒂芬。 – lulu 2010-06-11 01:10:39

+0

我可以看到上述想法在何處可以提供幫助,以及在調試中使用運行時頭文件功能作爲策略,並且可能也會幫助其他人。 我問的是,似乎如果我使用合成的ivars創建64位,10.6運行時的項目,那麼我看不到調試數據引用,對我來說,這似乎很奇怪,(不能夠使用gdb或xcode調試),我確定我的設置中缺少一些東西。所以這就是我的問題的基礎:'我錯過了什麼?'。 – lulu 2010-06-13 18:25:32

+0

我所引用的只是編譯器可能根本不會生成ivars的事實。因此,爲什麼你應該使用運行庫來確保它們已經生成,而不僅僅依賴於(gdb)或XCode調試器。另外,由於編譯器沒有做任何聰明的事情,所以您可能需要添加'{}'以確保編譯器知道將代碼放在哪裏。不幸的是,只要我能幫到你。如果你不能用runtime.h看到你的ivars,那麼「新」的方式只是一堆馬 - 馬拉喀什,你永遠不應該使用這樣的「隱形」語法。 – 2010-06-14 12:48:59

2

我曾與高德合成同樣的問題。我的解決方案是切換到XCode 3.25中的LLVM 1.6編譯器。這帶回了調試器工具提示(對我最有幫助),但變量窗口仍然無法顯示ivars。

相關問題