2015-07-28 3 views
0

Я строю статическую библиотеку для iOS, и я хотел бы, чтобы некоторые методы были доступны для всех классов в библиотеке, но не вне библиотеки. Давайте сделаем пример:Метод, доступный только для классов в статической библиотеке

Это класс называется с двумя методами, доступными за пределами библиотеки:

@interface A : NSObject 

-(void)methoAvailableOutside1; 
-(void)methoAvailableOutside2; 

//This method has to be visible only to classes within the library 
-(void)methodInternalToTheLibrary; 

@end 

Класс называется B по-прежнему внутренняя библиотека. Можно назвать все методы, принадлежащих A (также метод, который должен быть «внутренним»):

Это реализация B:

#import "B.h" 

@implementation B 

-(instancetype)init{ 
    self = [super init]; 

    if(self){ 
     _aObject = [[A alloc]init]; 
     [_aObject methoAvailableOutside1]; 
     [_aObject methoAvailableOutside2]; 

     //here I can call the "internal" method 
     [_aObject methodInternalToTheLibrary]; 
    } 

    return self; 
} 

@end 

Теперь давайте писать ВНЕШНИЙ класс (внешних по отношению к библиотека, ясно):

#import "MyCustomLibrary.h" 

@interface ExternalClass : NSObject 

@property A* aObject; 

@end 

Это реализация внешнего класса:

#import "ExternalClass.h" 

@implementation ExternalClass 

- (instancetype)init 
{ 
    self = [super init]; 

    if (self) { 
     _aObject = [[A alloc]init]; 
     [_aObject methoAvailableOutside1]; 
     [_aObject methoAvailableOutside2]; 

     //!!!Here THIS SHOULD BE... 
     [_aObject methodInternalToTheLibrary]; 
     //...FORBIDDEN!!! 
    } 

    return self; 
} 

@end 

Как я могу это достичь? Заранее спасибо.

ответ

1

Единственный способ, о котором я могу думать, это иметь дополнительный файл заголовка с дополнительным методом, определенным в этом заголовке. Анонимные категории.

publicHeader.h 
@interface A : NSObject 
-(void)methoAvailableOutside1; 
-(void)methoAvailableOutside2; 
@end 

А затем файл .hh используется только в вашем библиотечном коде.

privateHeader.h 
@interface A() 
//This method has to be visible only to classes within the library 
-(void)methodInternalToTheLibrary; 
@end 

Может ли это сработать? Это не гарантирует, что другой код не сможет вызвать метод, но намерение будет ясным.

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