2014-02-17 3 views
4

Внешний framework Я использую в своем приложении theClass, внутренняя структура которого непрозрачна.Objective-C: доступ к переменным экземпляра, объявленным как @private

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

@class TheClassPrivateVars; 

@interface TheClass : NSObject 
{ 
    @private 
    TheClassPrivateVars *_theClassPriv; 
} 

@end 

рамки общедоступный интерфейс не так полна, как это должно быть, и (на мой, я свой страх и риск) Я хочу, чтобы прочитать одну из частных переменных myClass.

К счастью рамки поставляется с полным исходным кодом, так у меня есть доступ к определению TheClassPrivateVars:

@interface TheClassPrivateVars : NSObject 
{ 
    int thePrivateInstanceVar; // I want to read this! 

    // 
    // other properties here... 
    // 
} 

@end 

Я сделал заголовочный файл с указанным кодом и включить его только в источнике файл, в котором должен произойти «оскорбительный доступ».

theValue = instanceOfTheClass->_theClassPriv->thePrivateInstanceVar; 

К сожалению _theClassPriv объявлен @private.

Есть ли способ обойти его без изменения исходного файла заголовка?

+1

Не для этого нужны методы доступа? Или вы не можете редактировать код внешней структуры? Может быть, вы можете подклассы TheClass или добавить его как свойство в собственный класс? Чтение свойства myClass не должно быть слишком рискованным, если вы не начнете редактировать значение по адресу, на который указывает указатель. – Fnord23

+0

для этого нет метода доступа, и я не хочу редактировать код фреймворка и перекомпилировать его. – Paolo

+1

@Paolo: «Я не хочу редактировать код рамки и перекомпилировать его». Вам не нужно будет редактировать код рамки. Вам просто нужно определить категорию класса в * вашем * коде. – newacct

ответ

14
TheClassPrivateVars* private = [instanceOfTheClass valueForKey:@"_theClassPriv"]; 

EDIT: или с помощью ключа путь:

theValue = [[instanceOfTheClass valueForKeyPath:"_theClassPriv.thePrivateProperty"] integerValue]; 
+1

Это не сработает - есть только переменная экземпляра, а не свойство. – Avt

+3

давайте попробуем;) это будет –

+0

Не стреляйте в меня, если я ошибаюсь, но я думаю, что использование точечной нотации для доступа к свойству работает только тогда, когда методы доступа были «синтезированы», что сделало бы этот вопрос устаревшим , – Fnord23

-1

бы, вероятно, будет хорошей идеей, если это структура Apple, чтобы сказать нам, какие рамки и какое имущество вы говорите, для некоторых образованных догадок точно, насколько глупо или нет, чтобы получить доступ к этой частной собственности. В конце концов, частная собственность может уйти завтра. И вы не сможете легко получить свое приложение в App Store.

+1

рамки не от Apple (Apple не выпускает исходный код своих фреймворков), и приложение не должно быть распространено среди общественности через интернет или магазин приложений (его просто используется внутри нашей компании) – Paolo

4
#import <objc/runtime.h> 

TheClassPrivateVars *_data; 
object_getInstanceVariable(self, "_theClassPriv", (void**)&_data); 

Не могли бы вы просто сделать это?

+0

minor typo - should be #import OlDor

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