2015-11-18 2 views
0

Я знаю, что защищенная переменная не может быть доступна вне класса, но возможно ли получить доступ к ним в категории или в SubClass, я думаю, что это невозможно для подкласса, но это тот же случай для категории?Как получить доступ к защищенной переменной в Objective-C?

Что я хочу сделать, это некоторая модификация формы библиотеки github, но я не хочу изменять исходный код. Я хочу достичь этого путем подклассификации или использования категории, но проблема в том, что я хочу ссылку на некоторую защищенную переменную.

Protected переменная в файле .m: -

@interface Someclass() { 
    NSMutableDictionary *viewControllers; 
     __weak UIViewController *rootViewController; 
    UIPageViewController *pageController; 
} 

@end 
+0

Обычно я не использую категории, поэтому не знаю. В этом руководстве есть все ответы, хотя http://rypress.com/tutorials/objective-c/categories – noobsmcgoobs

ответ

1

категория не может получить доступ к закрытым переменным экземпляра не может подклассом сделать это.

Поскольку у вас есть доступ к исходному коду и вы просто не хотите менять исходный код, вы можете создать другой класс с точно такой же структурой данных. (те же имена и типы переменных, которые указаны точно так же, как и последовательность).

@interface Shadowclass() { 
    NSMutableDictionary *viewControllers; 
     __weak UIViewController *rootViewController; 
    UIPageViewController *pageController; 
} 

@end 

Затем добавить методы получения и установки для Shadowclass, чтобы значения доступны.

Д.О.:

Someclass *someclass = ... // you get the object from somewhere somehow. 
object_setClass(someClass, [ShadowClass class]); 

Как SomeClass имеет тип ShadowClass, и вы можете получить доступ к геттер и сеттер. Честно говоря, я не уверен, как текущий компилятор позволяет напрямую получить доступ к геттерам, если вам разрешено отличать someClass, теперь ShadowClass, но вы можете использовать performSelector для доступа к геттерам или сеттерам.

Доступность геттеров и сеттеров прямо как [shadowClass rootViewController:xxx] может даже варьироваться независимо от того, используете ли вы ARC или нет. (Возможно, поведение компилятора даже может быть настроено. Это также я не знаю по деталям из головы.)

Однако я не уверен, действительно ли я рекомендую это! Вы можете найти менее «хакерские» альтернативы. И не стоит недооценивать важность создания точно такой же структуры для Shadowclass как для Someclass!