Создавая NSArray, инициализированный с количеством N, всем тем же объектом

Подклассы ваших текстовых полей ... а также текстовых представлений

В подкласс поместите этот код ..

-(void)conformsToKeyboardDismissNotification{

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(dismissKeyBoard) name:KEYBOARD_DISMISS object:nil];
}

-(void)deConformsToKeyboardDismissNotification{

    [[NSNotificationCenter defaultCenter] removeObserver:self name:KEYBOARD_DISMISS object:nil];
}

- (void)dealloc{
    [[NSNotificationCenter defaultCenter] removeObserver:self];
    [self resignFirstResponder];
}

В делегатах текстового поля (аналогично для делегатов текстового обзора)

-(void)textFieldDidBeginEditing:(JCPTextField *)textField{
     [textField conformsToKeyboardDismissNotification];
}


- (void)textFieldDidEndEditing:(JCPTextField *)textField{
    [textField deConformsToKeyboardDismissNotification];
}

Все готово. Теперь просто отправьте уведомление из любого места в вашем коде. Он подаст в отставку любую клавиатуру.

9
задан Quinn Taylor 2 July 2009 в 03:39
поделиться

3 ответа

Я согласен с @mmc , убедитесь, что у вас есть веская причина для создания такой структуры (вместо использования одного и того же объекта N раз), но Я предполагаю, что вы это сделаете.

Есть другой способ создания неизменяемого массива, который был бы немного быстрее, но для него требуется создать массив объектов C и передать его в NSArray + arrayWithObject: count: метод (который, заметьте, возвращает автоматически выпущенный массив) следующим образом:

id anObject = [NSNumber numberWithInt:0];
id* buffer = (id*) malloc(sizeof(id) * anIntVariable);
for (int i = 0; i < anIntVariable; i++)
  buffer[i] = anObject;
NSArray* array = [NSArray arrayWithObjects:buffer count:anIntVariable];
free(buffer);

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

Существует другой способ создания неизменяемого массива, который был бы немного быстрее, но для него требуется создать массив объектов C и передать его методу NSArray + arrayWithObject: count: (который возвращает автоматически выпущенный массив , заметьте) следующим образом:

id anObject = [NSNumber numberWithInt:0];
id* buffer = (id*) malloc(sizeof(id) * anIntVariable);
for (int i = 0; i < anIntVariable; i++)
  buffer[i] = anObject;
NSArray* array = [NSArray arrayWithObjects:buffer count:anIntVariable];
free(buffer);

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

Существует другой способ создания неизменяемого массива, который был бы немного быстрее, но для него требуется создать массив объектов C и передать его методу NSArray + arrayWithObject: count: (который возвращает автоматически выпущенный массив , заметьте) следующим образом:

id anObject = [NSNumber numberWithInt:0];
id* buffer = (id*) malloc(sizeof(id) * anIntVariable);
for (int i = 0; i < anIntVariable; i++)
  buffer[i] = anObject;
NSArray* array = [NSArray arrayWithObjects:buffer count:anIntVariable];
free(buffer);

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

2
ответ дан 4 December 2019 в 10:05
поделиться

Я не вижу причин, по которым эта структура в неизменяемом формате была бы полезной, но я уверен, что у вас есть свои причины.

Я не думаю, что вы у вас есть любой выбор, кроме как использовать NSMutableArray, построить его с помощью цикла for, и, если действительно важно, чтобы результат не был изменяемым, создайте NSArray и используйте arrayWithArray:

3
ответ дан 4 December 2019 в 10:05
поделиться

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

Существует три разных семантики:

  • сохранить ] - Вы получите десять указателей на одну и ту же изменяемую строку, и изменение любого из них изменит все десять.

  • copy - Вы получите десять указателей на одну и ту же неизменяемую строку или, возможно, десять разные указатели на неизмеримые строки с одинаковым значением, но в любом случае вы не сможете изменить ни один из них.

  • mutableCopy - вы получите десять различных изменяемых строковых объектов, любой из которых вы можете менять самостоятельно.

Итак, Apple могла написать три варианта метода или иметь какой-то параметр для управления семантикой, оба из которых уродливы, поэтому вместо этого они оставили вам писать код. Если хотите, вы можете добавить его как метод категории NSArray, просто убедитесь, что вы понимаете семантические параметры и проясните их.

Метод:

-(id)initWithArray:(NSArray *)array copyItems:(BOOL)flag

имеет ту же проблему.

Решение Куинна с использованием arrayWithObjects: count : достаточно хороший, вероятно, лучший, который вы можете получить для общего случая. Поместите его в категорию NSArray, и это будет примерно так же хорошо, как и вы.

просто убедитесь, что вы понимаете семантические параметры и проясните их.

Метод:

-(id)initWithArray:(NSArray *)array copyItems:(BOOL)flag

имеет ту же проблему.

Решение Куинна с использованием arrayWithObjects: count: достаточно хорошее решение, вероятно, лучшее из того, что вы можете получить для общего случая. Поместите его в категорию NSArray, и это будет примерно так же хорошо, как и вы.

просто убедитесь, что вы понимаете семантические параметры и проясните их.

Метод:

-(id)initWithArray:(NSArray *)array copyItems:(BOOL)flag

имеет ту же проблему.

Решение Куинна с использованием arrayWithObjects: count: достаточно хорошее решение, вероятно, лучшее из того, что вы можете получить для общего случая. Поместите его в категорию NSArray, и это будет примерно так же хорошо, как и вы.

2
ответ дан 4 December 2019 в 10:05
поделиться