Лучше ли возвращать NSArray или void и обновлять свойство self?

#objective-c #properties #return #self

#objective-c #свойства #Возврат #self

Вопрос:

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

-(NSArray)blah{ вернуть myarray; }

или -(void)бла{ [self myarray:значение] }

————— Разъяснение вопроса ниже

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

Ответ №1:

Для каждого подхода есть свой вариант, в зависимости от того, что вы на самом деле делаете. Есть два варианта:

  • Это действительно вспомогательный метод, который используется во многих местах вашего приложения.
  • Оно специфично для одного класса, и словарь является членом этого класса.

ВАРИАНТ 1) Если это действительно вспомогательный метод, я считаю, что вам следует вернуть NSDictionary из метода. Я предполагаю, что оно вновь выделено в рамках этого метода.

Другими словами, предпочесть:

   (NSDictionary *) dictFromArray:(NSArray *);
  

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

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

В Objective-C об этом заботится подсчет ссылок, поэтому вы можете избежать дополнительного кода выделения пустых объектов только для вызова метода.

Например:

 NSMutableDictionary *myDict = [[NSMutableDictionary alloc] init];
dictFromArray(myArray, myDict);
  

Когда дело доходит до определения владельца объекта, вы должны придерживаться соглашений Objective-C, где:

   (NSDictionary *) dictFromArray:(NSArray *)array
  

возвращает объект autorelease, поэтому вызывающий объект знает, что ему нужно сохранить его, если он хочет сохранить ссылку.

ВАРИАНТ 2) Если функциональность специфична для одного класса и этот класс имеет словарь в качестве члена, тогда я бы передал массив, обновил переменную-член словаря, используя содержимое массива, и вернул void.

Что-то вроде:

 - (void) setBlahFromArray:(NSArray *)array
  

Ответ №2:

Как указано, вопрос сбивает с толку. Если это свойства, то у вас есть методы доступа, которые обычно включают что-то вроде:

 -(void) setMyValue: (NSString*) inNewValue;
-(NSString*) myValue;
  

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