Obj-C, свойства для всего - PullRequest
       18

Obj-C, свойства для всего

4 голосов
/ 24 января 2012

Я начал работать в новой компании, и одно из руководящих указаний, которое мне было предписано руководителем моей группы, заключается в том, чтобы редко использовать retain / release и вместо этого полагаться на свойства для управления памятью. Я вижу привлекательность держать код в чистоте и оставлять меньше места для ошибок, но открывать такие интерфейсы мне неудобно. Вообще говоря, архитектура очень хорошая, но я всегда был педантичен по поводу закрытия своих классов перед внешним миром.

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

Ответы [ 2 ]

10 голосов
/ 24 января 2012

Нет необходимости выставлять свойства всему миру.В вашем файле реализации .m вы можете добавить небольшую категорию для объявления «частных» свойств.Например,

#import "Class.h"

@interface Class ()
@property (nonatomic, strong) NSDate *privateProperty
@end

@implementation Class

@synthesize privateProperty;

...
@end

Ничто в Objective-C никогда не бывает по-настоящему приватным в строгих терминах, поэтому я бы сказал, что это хорошая практика - он скрывает почти все вещи сохранения / выпуска без необходимости в ARC-совместимой среде выполненияи имеет побочный эффект: вы вообще не обязаны указывать переменные экземпляра в заголовке (хотя есть и другие способы добиться этого).

Как историческая справка, я думаю, что это был первый способ перемещенияПеременные экземпляра вне заголовка - что разрешено только «новой» средой выполнения на iOS и 64-битной Intel 10.6+ - так что это может быть вторичной причиной, по которой ваша команда остановилась на этом.Если они явно не сказали вам сделать ваши классы прозрачными, они могут фактически полностью соответствовать вашему чувству (и общепринятому объектно-ориентированному принципу), что реализации должны быть непрозрачными.

2 голосов
/ 24 января 2012

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

Например:

// in AnObject.h
@interface AnObject : NSObject
@end

// in AnObject.m
@interface AnObject () // () is class extension, (foo) is a class category
@property (retain) NSString *foo;
@end

@implementation AnObject
@synthesize foo;
@end

Для получения дополнительной информации см. Документацию Apple.

...