Почему executeSelector: withObject: методы могут принимать только идентификатор? - PullRequest
2 голосов
/ 21 марта 2011

В Objective-C все методы, выполняющие селекторы, имеют вид:

 - performSelector:withObject:
 - makeObjectsPerformSelector:withObject:
 - performSelectorInBackground:withObject:

И могут принимать только объекты id (Pointer) в параметре?Ты знаешь почему ?это что-то унаследованное от C, и для работы с потоками нам нужен указатель?


Edit: И в Objective-C мы не можем создать указатель напрямую.Если я хочу сделать что-то вроде ниже с указателем, это работает или нет?(Я знаю о классах NSNumber и NSValue, но я просто хочу понять, как это работает)

int i = 5;
int *pointer_i = &i;
[self performSelector:mySelector withObject:pointer_i];

Ответы [ 4 ]

3 голосов
/ 21 марта 2011

Вы можете указывать указатель только как аргументы, так как объекты target-c.Если вы хотите использовать целое число, попробуйте это:

int i;
[self performSelector:@selector(mySelector:) withObject:[NSNumber numberWithInt:i]];
2 голосов
/ 22 марта 2011

Вы можете разыграть withObject:(id)pointer_i, но это плохая идея .
В данном конкретном случае аргументом withObject: является retain ed.Если вы передадите int *, где метод ожидает id, ваша программа потерпит крах, потому что она пытается retain int!

1 голос
/ 21 марта 2011

Потому что id - это указатель на любой тип объекта. Таким образом, вам не нужно знать, какой тип объекта вы получили (NSString, NSArray). Идентификатор может указывать на что угодно.

0 голосов
/ 20 января 2013

По сути, вы можете передать любой отдельный объект (который сам может быть массивом или словарем, если вам нужна такая гибкость, но вы, конечно, должны иметь возможность передавать это внутри вызываемой функции.

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

Чтобы использовать предыдущий пример

[self performSelector:@selector(mySelector:) withObject:[NSNumber numberWithInt:i]];

"mySelector:" нужно двоеточие.

Ладно, может быть, это мелочь, и она очевидна для хардкорных кодеров, но мне потребовалось много времени, чтобы отладить это. Если ваш код дает сбой, а передаваемый вами объект действителен, то, вероятно, селектор - нет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...