Так у меня есть MainController,
внутри заголовка У меня есть этот void*
заявил:Соблюдая изменения объекта ш /, кажется, не будет работать с ничтожной * КВО, контекст указатель, но работает с NSString *
static void *kStrokeColorWellChangedContext = &kStrokeColorWellChangedContext;
Внутри реализации я обработка наблюдений:
-(void)observeValueForKeyPath:(NSString *)keyPath
ofObject:(id)object
change:(NSDictionary *)change
context:(void*)context
{
if([keyPath isEqualToString:@"color"])
{
if(context == kStrokeColorWellChangedContext)
{
[self setValue:[change objectForKey:@"new"] forKey:@"strokeColor"];
}
}
Тогда у меня есть ViewController, который имеет эту линию, которая добавляет MainController в качестве наблюдателя на вид
[self.strokeColorWell addObserver:self.toolController forKeyPath:@"color" options:NSKeyValueObservingOptionNew context:kStrokeColorWellChangedContext];
Поэтому, когда цвет меняет взгляд, он уведомляет MainController и входит в -observeValueForKey:
рутины, ж/ключ @"color"
Но он не может войти во внутренний блок if
, где я проверяю context
.
Если бы я был заменен на void*
с NSString*
, он работает так, как я ожидал.
Как могло случиться, что в нем есть два разных адреса: void*
?
EDIT: Возможно значения void*
может помочь
Результат po kStrokeColorWellChangedContext
:
0x00000001005553e8
результат po context
в -observeValueForKey:
:
0x0000000100555ea0
objc [17775]: Метод кэша поврежден. Это может быть сообщение для недопустимого объекта или ошибка памяти в другом месте.
ObjC [17775]: приемник 0x100555ea0, SEL 0x7fff899c8246, иш 0x100555ea0, кэш> 0x100555eb0, ведро 0x100566160, маска 0x0, оккупировал 0x0
ObjC [17775]: приемник 0 байты, ковши 0 байты
ObjC [17775]: селектор «respondsToSelector:»
исключения бросают может быть намек, но я действительно не понимаю ничего из этого
EDIT2: выход p
вместо po
(lldb) p context
(void *) $5 = 0x0000000100555ea0
(lldb) p kStrokeColorWellChangedContext
(void *) $6 = 0x00000001005553e8
Обратите внимание, что я очень уверен, что отлаживаю правильное уведомление.
Две причины: keyPath
уникален, и я вижу, что это значение правильно. Также, если я использую NSString*
в качестве контекста, он работает
У вас, похоже, есть опечатка в вашей строке 'static void'. Обе стороны '=' ссылаются на одно и то же имя переменной. Это, вероятно, не то, что вы хотите сделать. – rmaddy
Я знаю, что это выглядит странно, но это похоже на The Way, как описано в NSHipster - хотя код addObserver не показан в этом случае, но с или без него он должен быть таким же. –
Вы не можете использовать 'po' с аргументом 'context', потому что' context' не является объектом. Вот почему вы видите сообщение об ошибке «Это может быть сообщение недействительному объекту ...» – jlehr