2013-09-05 3 views
0

Я пытаюсь скрыть сеттер в @property для заголовка я делает общедоступными в рамках Я здание:Частная собственность, «пакет» сеттер

//File: X.h 
@interface X 
@property (nonatomic,readonly, strong) NSString* identifier; 
@end 

У меня есть категория что добавляет некоторые методы этого интерфейса:

//File: X+implementation.h 
@interface X (Implementation) 
... 
@end 

Эта категория доступна только в моем проекте, то есть я не делаю это общественность, когда я строю рамки. Многие источники говорят, что я должен добавить расширение интерфейса с свойством readwrite, но это бесполезно, так как моя категория не сможет увидеть определение readwrite на «X.m». Так я думал, чтобы добавить его в категории декларации:

//File: X+implementation.h 
@interface X() 
@property (nonatomic, readwrite, strong) NSString* identifier; 
@end 
//same file 
@interface X (Implementation) 
... 
@end 

это компилируется, но дает мне [X setIdentifier]: непризнанные селектор посланный к экземпляру

Я попытался повторить расширение на Xm, чтобы вручную создать сеттеры под Xm, вручную @synthesize переменную, но ни одна из них не работает. Что мне делать в этом случае?

+0

В 'Файл: X + implementation.h' интерфейс должен быть' @interface X (реализация) 'not' @interface X() ' –

+0

Привет, Оливер, если вы видите, @interface X (Реализация) является также определяется под расширением, после того, как тот же комментарий файла – scooterman

ответ

1

В X.h объявить только для чтения свойство, как обычно.

@interface X : XSuperclass 
@property (nonatomic,readonly, strong) NSString* identifier; 
@end 

В X.m переопределите свойство как readwrite в расширении класса. Это будет по-прежнему подвергать свойство автосинхронизации, тем самым обеспечивая реализацию сеттера.

@interface X() 
@property (nonatomic,readwrite, strong) NSString* identifier; 
@end 

@implementation X 
// Your class's main implementation 
@end 

В файле реализации вашей категории объявите - но не реализуйте - другая категория, только видимая вашей категории. Повторно объявить свойство, как READWRITE там:

@interface X (CategoryPrivate) 
@property (nonatomic,readwrite, strong) NSString* identifier; 
@end 

@implementation X (Category) 

// your category impl here 
- (void)methodName { 
    self.identifier = @"id"; 
} 

@end 

Это действительно есть проблемы ремонтопригодность благодаря дубликата декларации READWRITE собственности. Но для этого требуется меньше кода и возможной путаницы, чем другие способы его реализации.

+0

Это сработало, спасибо. Просто из любопытства, каковы другие альтернативы для реализации одной и той же функции? – scooterman

+0

Два метода, в частности, я думал: 1) вручную реализовать сеттер в частной категории 2) иметь целый отдельный заголовок и категорию с реализациями для «частных» функциональных возможностей. Не совсем радикально отличающийся от этого подхода, по-разному организованный. –

0

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

Заголовок:

@interface X : NSObject 

@property (nonatomic, strong, readonly) NSString *identifier; 

@end 

Реализация:

@interface X() 

@property (nonatomic, strong, readonly) NSString *identifier; 

@end 

@implementation X 

//.. your implementation goes here 

@end 
Смежные вопросы