Правильный способ обработки передачи простых данных в вызовы ‘withObject’

#objective-c

#objective-c

Вопрос:

При использовании objective-c существует множество различных способов, которыми вы можете наткнуться на что-то, что использовало бы withObject. Хорошим примером является performSelectorOnMainThread.

 [self performSelectorOnMainThread:@selector(aSelector) withObject:anObject waitUntilDone:YES];
  

Это вызывает селектор как селектор с объектом anObject. Я часто сталкиваюсь с селектором, который принимает простой тип данных, такой как int или enum, и я хочу передать это в ‘withObject’. Каков правильный способ сделать это?

Ответ №1:

Для такого рода операций Cocoa действительно нужен класс Objective-C, производный от NSObject . Для передачи простых типов, таких как целое число, bool или значение с плавающей точкой, класс NSNumber может использоваться для инкапсуляции значения в вызове селектора. Это довольно просто с помощью служебных методов, которые класс предоставляет как для создания объекта NSNumber из примитивного типа, так и для извлечения этого примитивного типа обратно из объекта:

 - (void)action:(id)sender
{
    enum EnumType eVal = /* ... */;
    [self performSelectorOnMainThread:@selector(aMethod:) withObject:[NSNumber numberWithInt:(int)eVal] waitUntilDone:YES];
}

- (void)aMethod:(NSNumber)enumValue
{
    enum EnumType eVal = (EnumType)[enumValue intValue];
}
  

Существует также класс NSValue, который может делать то же самое для типов более низкого уровня, таких как указатели или байтовые строки.

Ответ №2:

Вы захотите обернуть это в какой-нибудь объект. Используйте либо пользовательский объект данных, либо, в случае простых примитивов NSNumber .

Комментарии:

1. Это не столько то, что он захочет , сколько то, что он должен сделать.

2. @Richard Да, ну, это тоже работает. Я видел это где-то в ImageIO. performSelector:@selector (setAllow:) withObject:(id) ДА