#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;
но, похоже, вы, вероятно, спрашиваете о чем-то другом, поскольку они могут быть динамически синтезированы для вас компилятором… Поэтому попробуйте перефразировать вопрос, и мы попытаемся еще раз помочь.