2013-08-08 2 views
1

Недавно я начал разрабатывать для IOS и бороться с объектом Invocation.IOS NSMethodSignature остается nil

Что я имею класса «Location», полученный из NSManagedObject (это часть модели CoreData)

@interface Location (CoreDataGeneratedAccessors) 

- (void)addHasLocationInfoObject:(Info *)value; 
... 
@end 

У меня также есть другие классы, которые имеют аналогичные подписи (addHasWorkorderInfoObject, ...).

Эти объекты InfoObject имеют ограничения со своими «родительскими объектами», в этом случае «Местоположение» имеет несколько объектов «LocationInfo», которые я извлекаю из базы данных и хочу добавить в местоположение. То же самое должно произойти со всеми объектами, которые назначены InfoObjects.

Теперь я пытаюсь создать метод, который будет работать для любого объекта, который придерживается соглашений об именах, зафиксированных проектной документацией (Location -> addHasLocationInfoObject, XY -> addHasXYInfoObject ...).

Моего подхода для добавления информации к объектам сейчас:

-(void)setInfoForObject:(NSManagedObject *)managedObject withClass:(NSString *)className 
NSString *noteRefName = [[NSString alloc]init]; 
noteRefName = [NSString stringWithFormat:@"%@Info", className]; 
NSString *addInfoSelectorName = [[NSString alloc]init]; 
addInfoSelectorName = [NSString stringWithFormat:@"addHas%@Object::", infoClassName]; 

SEL addInfoPropertySelector = NSSelectorFromString(addInfoSelectorName); 
NSMethodSignature *signature = [[managedObject class] methodSignatureForSelector:addNotePropertySelector]; 
NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature]; 

[invocation setTarget:managedObject]; 
[invocation setSelector:addInfoPropertySelector]; 
[invocation setArgument:&note atIndex:2]; 

Однако это дает мне ошибку, так как объект Signature получает значение ноля. Я попытался найти проблему и, похоже, связан с именем «:» в имени «Селекторы».

Но я не понимаю, сколько и где и почему я должен их установить? Мне также кажется, что не удается найти страницу Документов, в которой рассказывается, как сделать это правильно.

Anny help оценили, спасибо заранее!

PS. Я запустил имя SelectorName и имя класса, и оба они написаны правильно.

+2

не уверен, я понимаю, почему вы сложили два «::» в имени метода, а в сигнатуре метода есть только один? – kovpas

+0

, потому что он ни работал без: ни с одним:, поэтому я дал ему выстрел ^^ – billdoor

+0

NSLog сгенерированное имя селектора. ("addHas (null) Object:" не является допустимым именем селектора, например.) –

ответ

2

Хорошо, я вижу несколько проблем в вашем коде. Прежде всего, вы выделяете пустые строки экземпляров, а затем сразу же повторно записать их с новыми экземплярами:

NSString *noteRefName = [[NSString alloc]init]; 
noteRefName = [NSString stringWithFormat:@"%@Info", className]; 

Это неправильно. Правильный путь:

NSString *noteRefName = [NSString stringWithFormat:@"%@Info", className]; 

Существует два типа методов в методах ObjC: class и методы экземпляра. Если вы не знаете разницы, читайте об этом here. Итак, вторая проблема заключается в том, что вы пытаетесь получить подпись метода класса с methodSignatureForSelector: вместо получения подписи метода экземпляра с помощью instanceMethodSignatureForSelector:.

Итак, насколько я могу судить, правильный способ переписывания этот кусок кода может быть:

NSString *addInfoSelectorName = [NSString stringWithFormat:@"addHas%@Object:", infoClassName]; 
... 
NSMethodSignature *signature = [[managedObject class] instanceMethodSignatureForSelector:addNotePropertySelector]; 
+0

Я исправил создающие пустые объекты, но ваше исправление приводит к той же ошибке – billdoor

+0

, тогда, я думаю , managedObject ошибочен. Я только что создал тестовый проект, и он отлично работает для меня. – kovpas

+0

NSLog ([NSString stringWithFormat: @ "% @ -% @", [managedObject class], addNoteSelectorName]); Записывает правильные значения «Местоположение - addHasLocationInfoObject» – billdoor

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