Ответ 1
Я реализую свои частные свойства следующим образом.
MyClass.m
@interface MyClass ()
@property (nonatomic, retain) NSArray *someArray;
@end
@implementation MyClass
@synthesize someArray;
...
Это все, что вам нужно.
Есть ли способ объявить частную собственность в 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 implementation
@end
@implementation MyClass
...
@end
Я реализую свои частные свойства следующим образом.
MyClass.m
@interface MyClass ()
@property (nonatomic, retain) NSArray *someArray;
@end
@implementation MyClass
@synthesize someArray;
...
Это все, что вам нужно.
A. Если вы хотите полностью закрытую переменную. Не давайте ему собственность.
B. Если вы хотите, чтобы переменная readonly, доступная внешняя от инкапсуляции класса, использует комбинацию глобальной переменной и свойства:
//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
Как указывали другие, (в настоящее время) нет способа действительно объявить частную собственность в Objetive-C.
Одна из вещей, которую вы можете сделать, чтобы попытаться "защитить" свойства каким-то образом, состоит в том, чтобы иметь базовый класс со свойством, объявленным как readonly
, и в ваших подклассах вы можете переопределить то же свойство, что и readwrite
.
Документацию Apple по обновленным свойствам можно найти здесь: http://developer.apple.com/library/ios/DOCUMENTATION/Cocoa/Conceptual/ObjectiveC/Chapters/ocProperties.html#//apple_ref/doc/uid/TP30001163-CH17-SW19
Это зависит от того, что вы подразумеваете под "private".
Если вы просто имеете в виду "не публично документированные", вы можете легко использовать расширение класса в закрытом заголовке или в файле .m.
Если вы имеете в виду, что "другие вообще не могут назвать это", вам не повезло. Любой может вызвать метод, если он знает свое имя, даже если оно не публично задокументировано.