Частная собственность в Objective C

Есть ли способ объявить частную собственность в 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

Ответ 1

Я реализую свои частные свойства следующим образом.

MyClass.m

@interface MyClass ()

@property (nonatomic, retain) NSArray *someArray;

@end

@implementation MyClass

@synthesize someArray;

...

Это все, что вам нужно.

Ответ 2

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

Ответ 3

Как указывали другие, (в настоящее время) нет способа действительно объявить частную собственность в 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

Ответ 4

Это зависит от того, что вы подразумеваете под "private".

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

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