2012-12-30 2 views
1

Позвольте мне начать с того, что я новичок в Objective C.Как правильно использовать makeObjectsPerformSelector: Получение сообщение об ошибке непризнанные селектор

Я получаю ошибку atusMenuApp[24288:303] -[__NSCFConstantString createListItem]: unrecognized selector sent to instance 0x100002450

Вот мой код:

selector = [NSMutableArray arrayWithObjects: @"nvda", @"aapl", @"goog", nil]; 
[selector makeObjectsPerformSelector:@selector(createListItem:) withObject:self]; 

- (void)createListItem:(NSString *)title { 
//do some stuff 
} 

Теперь я сделал много оглядываясь по сторонам, и кажется, что самая большая причина для этой проблемы заключается в добавлении или отсутствии :, однако я верю, что правильно имею это место. Может быть, я не понимаю, использование makeObjectsPerformSelector очень хорошо, как после просмотра на документ на нем я нашел:

Sends to each object in the array the message identified by a given selector, starting with the first object and continuing through the array to the last object.

Любая помощь будет здорово, спасибо!

ответ

5

[Только если вы читать документацию (или немного подумал о том, почему метод назван таким образом, и не то, что), или даже сделал усилие, пытаясь понять сообщение об ошибке ...]

Метод makeObjectsPerformSelector:withObject:NSArray делает то, что он предлагает: делает объекты массива выполняют селектор, который может иметь необязательный аргумент. Так

[selector makeObjectsPerformSelector:@selector(createListItem:) withObject:self]; 

отправит createListItem: сообщений для каждого NSString объекта в selector массиве и передать в self в качестве аргумента. Он не будет выполнять селектор на self, проходящий в объекте. . I. е, что у вас есть эквивалент

for (NSString *obj in selector) { 
    [obj createListItem:self]; 
} 

Очевидно, вместо этого вы хотите следующее:

for (NSString *obj in selector) { 
    [self createListItem:obj]; 
} 

Вам даже не нужен этот неприятный способ для этого. Хорошее быстрое перечисление for loop сделает это.

+1

+1. Вы видели, что искатель отменил аргументы, изучив аргумент, который принимает метод, и содержимое массива. Очевидно, я не выглядел достаточно глубоко, поэтому я знал, почему они получают исключение, но не понял, почему они думали, что они будут делать. :) – Metabble

+0

@Metabble Спасибо. Это было настолько непреодолимо очевидным, что я почувствовал желание ответить: P –

+0

Если бы вы не ответили, они, вероятно, в итоге получили бы десять ответов, в которых «NSString» не реализует 'createListItem', и они в конечном итоге путаются. xD – Metabble

1

Сначала вы делаете массив из NSString. Затем вы отправляете им все сообщение createListItem. Это все нормально и денди, но у NSString нет способа под названием createListItem; просто потому, что вы определили метод экземпляра, называемый createListItem, не означает, что каждый экземпляр каждого класса может его использовать. Только класс, который имеет файл реализации, имеет определение, которое сможет обрабатывать сообщение. Например, я не могу составить список экземпляров , а затем определить метод fly в другом классе с именем Helicopter и ожидать, что он сможет вызвать fly по экземпляру Car; только Helicopter можно использовать. Я рекомендую вам прочитать хорошую книгу по Objective-C и познакомиться с классами, примерами и методами экземпляра.

1

Вы неправильно поняли метод.

Он будет вызывать метод createListItem: с аргументом self по всем объектам NSArray.

Так полученный вызов будет что-то вроде:

[@"nvda" createListItem:self]; 
... 

Очевидно, что метод не существует для NSString и там идет ваше исключение.

Если вам нужно применить метод self к каждому объекту внутри вашего массива, просто проведите его через него.

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