Так что это очень странно. Я только что создал новый синглтон в своем приложении, используя тот же шаблон, который я использовал для многочисленных других синглтонов. Однако этот режим не очень хорошо работает с отладчиком. Вот код для получения одноплодной: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;
}
Как вы можете видеть, 'lldb' ищет' -sharedInstance', который является методом экземпляра, а не методом класса. Посмотрите, помогает ли [this] (http://stackoverflow.com/questions/9887740/how-to-call-class-methods-in-the-ios-simulator-with-lldb). – trojanfoe