2015-03-16 1 views
0

Так что это очень странно. Я только что создал новый синглтон в своем приложении, используя тот же шаблон, который я использовал для многочисленных других синглтонов. Однако этот режим не очень хорошо работает с отладчиком. Вот код для получения одноплодной:Obj C: Не удалось получить доступ к singleton от отладчика

- (id)init 
{ 
    self = [super init]; 
    if (self) { 
     [self loadData]; 
    } 
    return self; 
} 

+ (Settings *)sharedInstance 
{ 
    static Settings *sharedInstance = nil; 
    static dispatch_once_t onceToken; 
    dispatch_once(&onceToken, ^{ 
     sharedInstance = [[self alloc] init]; 
     // Do any other initialisation stuff here 
    }); 
    return sharedInstance; 
} 

Теперь, когда я пытаюсь получить доступ к объекту из отладчика, это дает мне это:

error: Execution was interrupted, reason: EXC_BAD_ACCESS (code=1, address=0x20). 
The process has been returned to the state before expression evaluation. 

Очевидно, что я не пытался просто получить обрабатывать singleton от отладчика, я пытался получить свойство. Это дает еще более интересный результат:

(lldb) po [Settings sharedInstance].jpegCompressionLevel 
error: warning: got name from symbols: Settings 
warning: receiver type 'void *' is not 'id' or interface pointer, consider casting it to 'id' 
error: no known method '-sharedInstance'; cast the message send to the method's return type 
error: 1 errors parsing expression 

Что происходит в мире? Звонки из кода, похоже, все в порядке. Отладчик постоянно терпит неудачу. В том же контексте я могу получить доступ к другим синглонам (используя тот же шаблон) просто отлично.

Возможно, стоит заметить, что метод loadData просто загружает словарь с диска и что геттеры для свойств в классе используют значения в этом словаре, а не ivars.

Вот код для LoadData:

-(void)loadData 
{ 
    // Load data from persistent storage 
    NSString *path = [self pathToDataFile]; 
    NSMutableDictionary *settingsDict = [NSMutableDictionary dictionaryWithDictionary:[NSKeyedUnarchiver unarchiveObjectWithFile:path]]; 
    _settingsDict = settingsDict; 
} 
+2

Как вы можете видеть, 'lldb' ищет' -sharedInstance', который является методом экземпляра, а не методом класса. Посмотрите, помогает ли [this] (http://stackoverflow.com/questions/9887740/how-to-call-class-methods-in-the-ios-simulator-with-lldb). – trojanfoe

ответ

0

Теперь я не могу объяснить почему, но переименование класса от «Настройки» на что-то еще неподвижный вопрос. Я не вижу ничего в Symbol Navigator, который бы столкнулся с этим именем ... очень странно.

+0

Он полностью не зависит от имени класса. Я получил ту же ошибку для 'AVMediaTypeAudio'. Это системная константа и, похоже, не имеет возможности использовать ее в отладчике –

Смежные вопросы