частная собственность в объективе с
есть ли способ объявить частную собственность в Objective C? Цель состоит в том, чтобы извлечь выгоду из синтезированных геттеров и сеттеров, реализующих определенную схему управления памятью, но не открытых для общественности.
попытка объявить свойство в категории приводит к ошибке:
@interface MyClass : NSObject {
NSArray *_someArray;
}
...
@end
@interface MyClass (private)
@property (nonatomic, retain) NSArray *someArray;
@end
@implementation MyClass (private)
@synthesize someArray = _someArray;
// ^^^ error here: @synthesize not allowed in a category's implementation
@end
@implementation MyClass
...
@end
4 ответа:
я реализую свои частные свойства, как это.
MyClass.м
@interface MyClass () @property (nonatomic, retain) NSArray *someArray; @end @implementation MyClass @synthesize someArray; ...
Это все, что вам нужно.
А. если вы хотите полностью закрытую переменную. Не давайте ему собственности.
B. если требуется переменная только для чтения, доступная извне из инкапсуляции класса, используйте комбинацию глобальной переменной и свойства://Header @interface Class{ NSObject *_aProperty } @property (nonatomic, readonly) NSObject *aProperty; // In the implementation @synthesize aProperty = _aProperty; //Naming convention prefix _ supported 2012 by Apple.
С помощью модификатора readonly теперь мы можем получить доступ к свойству в любом месте извне.
Class *c = [[Class alloc]init]; NSObject *obj = c.aProperty; //Readonly
но внутренне мы не можем установить aProperty внутри класса:
// In the implementation self.aProperty = [[NSObject alloc]init]; //Gives Compiler warning. Cannot write to property because of readonly modifier. //Solution: _aProperty = [[NSObject alloc]init]; //Bypass property and access the global variable directly
как указывали другие, (в настоящее время) нет способа действительно объявить частную собственность в Objective-C.
одна из вещей, которые вы можете сделать, чтобы попытаться "защитить" как-то свойства-это базовый класс со свойством заявлена как
readonly
и в ваших подклассах вы можете повторно объявить то же свойство, что иreadwrite
.документация Apple по повторно объявленным свойствам можно найти здесь: http://developer.apple.com/library/ios/DOCUMENTATION/Cocoa/Conceptual/ObjectiveC/Chapters/ocProperties.html#//apple_ref/doc/uid/TP30001163-CH17-SW19
Это зависит от того, что вы подразумеваете под "частным".
Если вы просто имеете в виду "публично не задокументированы", вы можете достаточно легко использовать расширение класс в частном заголовке или в поле .m-файл.
Если вы имеете в виду "другие не в состоянии назвать это вообще", вам не повезло. Любой человек может вызвать метод, если он знает его имя, даже если он не задокументирован публично.