2012-06-16 2 views
1

Я задавался вопросом о следующих строк кодаразница между использованием withObject: Я и withObject: ноль

[self performSelector:@selector(myMethod) withObject:self afterDelay:1.0]; 
[self performSelector:@selector(myMethod) withObject:nil afterDelay:1.0]; 
  1. Что разница между этими 2 строками кода.
  2. Когда мы должны установить объект как nil и когда мы должны установить объект как self?

В большинстве случаев я заметил, что объект должен быть установлен как nil.

+1

читать документацию https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/nsobject_Class/Reference/Reference.html –

+0

Я прочитал документ. Я попробовал оба кода линии в том же контексте, и он сработал. Поэтому хотелось узнать разницу, которую я не смог найти в Google. –

+0

- (void) performSelector: (SEL) aSelector withObject: (id) anArgument afterDelay: (NSTimeInterval) delay anArgument: аргумент для перехода к методу при его вызове. Pass nil, если метод не принимает аргумент. –

ответ

0

Разница заключается в том, передаете ли вы объект селектору или нет. Все, что делает селектор, описывают метод.

[self performSelector:@selector(myMethod) withObject:nil afterDelay:1.0]; 

отличается от:

[self performSelector:@selector(myMethod:usingThis:) withObject:nil afterDelay:1.0]; 

Теперь, если вы хотите селектор (т.е. метод), чтобы работать на какой-либо объект, который вы передаете в, скажем, массив, словарь или класс. Вы используете withObject. Как и в:

[self performSelector:@selector(myMethod:) withObject:myDictionary afterDelay:1.0]; 

-(void)myMethod:(NSDictionary*)dictionary 
{ 
// Do something with object 
} 

Вы могли бы пройти ни в чем, включая ссылки на текущий класс (например, я), как вы делали в вашем примере.

0

В первом примере вы передали себя как аргумент для передачи методу при его вызове. Но ваш метод не принимает аргументов, поэтому это лишний пух.

Во втором примере вы прошли nil, поэтому метод передается nil в его несуществующие аргументы, а затем завершается. Это более «эффективно» в том смысле, что, поскольку ваш метод не принимает аргументов и «nil. Является ли объект эквивалентным NULL, тогда вы пропускаете меньше пуха, который так или иначе игнорируется.

+0

Quoi? Что вы имеете в виду, метод не принимает аргумента? Я могу отправить нуль любому методу, который мне нравится. – CodaFi

+0

thats, что я имел в виду, если u pass nil, то метод не имеет никакого аргумента, если u передает значение, у которого есть аргумент, который может использовать его. –

+0

by -1 означает, что я ошибаюсь здесь –

8

В приведенном примере вы не испытаете никакого другого поведения, потому что ваш метод myMethod не принимает никаких аргументов. Где это полезно, это когда у вас есть метод, который принимает аргументы.

Предположим, мы объявили метод, squareRootMethod:, который принимает NSNumber и возвращает squareRoot. Затем вы можете позвонить по телефону [self performSelector:@selector(squareRootMethod:) withObject:numberToRoot afterDelay:1.0]

Существуют также методы, такие как performSelector:withObject:withObject: для селекторов, которые принимают более одного аргумента.

+1

'withObject: withObject'? Могу я увидеть документацию, сэр? – CodaFi

+4

[performSelector: withObject: withObject:] (https://developer.apple.com/library/ios/DOCUMENTATION/Cocoa/Reference/Foundation/Protocols/NSObject_Protocol/Reference/NSObject.html#//apple_ref/doc/uid/ 20000052-BBCGGCBE) –

+0

Ну, я буду ... – CodaFi

3

Обратите внимание на разницу между этими двумя:

@selector(myMethod) 
@selector(myMethod:) 

Первый из них представляет собой метод, который не принимает каких-либо параметров, второй метод, который принимает один параметр. Часть используемого метода withObject: используемого метода performSelector: позволяет передавать объект в метод при его вызове. Однако в случае, когда метод не принимает никаких параметров, это не имеет значения, потому что он не будет использоваться.

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