xcode 3.2.2 и target-c 2.0 и отладка: где находятся значения переменных свойства / экземпляра моего объекта в отладке? - PullRequest
8 голосов
/ 04 июня 2010

, работающий над проектом Mac OS (имеется в виду не iPhone), требующим 10.6 и 64-битным, позволяет мне использовать свойства для генерации как методов доступа, так и переменных экземпляра в заголовочном файле. но во время отладки я не вижу, как посмотреть значения свойств объекта после их заполнения. есть какие-то настройки сборки, которые нужно включить?

если я объявляю переменные экземпляра объекта (между {} в заголовке), то я могу видеть эти значения (когда они используются) во время отладки либо в самом окне отладки, либо с помощью наведения курсора на выделенный трюк в редакторе во время перерыва или путем выполнения cli в gdb, например, '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) 

так что смотрите в документах для объектива-c 2.0:

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

описывает то, что я имею в виду (синтез переменных экземпляра в «современной» среде выполнения), но что нигде не сказано, так это то, что если вы сделаете это, значения не будут доступны во время отладки.

Я нашел страницу SO с соответствующей информацией, но не сфокусирован на этом эффекте: Использование переменных экземпляра с Modern Runtime

что я пропустил?

Ответы [ 3 ]

2 голосов
/ 19 ноября 2010

В GDB вы можете использовать свойства get для доступа к динамическим ivars:

(gdb) po [newCard displayNumber]
0
2 голосов
/ 24 января 2011

У меня была такая же проблема с синтезированными иварами. Моим решением было переключиться на компилятор LLVM 1.6 в XCode 3.25. Это вернуло всплывающие подсказки отладчика (наиболее полезные для меня), но в окне переменных по-прежнему не отображаются ивары.

2 голосов
/ 10 июня 2010

Я предполагаю, что вы @synthesizing эти переменные?

Вам также может понадобиться { } в интерфейсе, чтобы компилятор знал, куда его поместить.

@interface Card : NSObject
{

}

Я бы избегал такого синтаксиса ... особенно если вы сами определяете свойства.

Кроме того, найдите <objc/runtime.h> и посмотрите, сможете ли вы распечатать список иваров для этого класса. Я все время использую следующее для отладки методов или классов из 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
    }
...