2016-06-24 2 views
0

Say, я определил приватную переменную isStarted в MyService классе & этот класс одноэлементно:доступ частной переменной без создания собственности

@implementation MyService { 
    BOOL isStarted; 
} 
... 
@end 

Мой вопрос:

Без создания недвижимости & accessors, Есть ли способ получить доступ к этой частной переменной из другого класса после того, как я получу экземпляр этой cla ss [MyService sharedInstance]. Если есть способ, не могли бы вы показать мне, как? Заранее спасибо.

(Пожалуйста, не говорите о «не рекомендуется делать так» и т.д. Я понимаю, что. Я просто любопытно о возможности доступа к частной области в Objective-C в целом.)

+0

ли вы имеете в виду без * производящего * аксессор с помощью @property, или вы имеете в виду без какого-либо метода доступа вообще? – danh

+0

См.: Http://jerrymarino.com/2014/01/31/objective-c-private-instance-variable-access.html – dan

+0

@ danh, было бы неплохо показать, как получить доступ к частной переменной без использования только свойства & как получить доступ без использования как свойств, так и аксессуаров. Мне любопытно об обоих сценариях. –

ответ

3

Hi again =) Есть способ - вы можете получить все переменные класса во время выполнения и там найти нужный. Тем не менее это трудно и не рекомендуется. Почему вы не хотите использовать свойства?

- (void*)getValueWithName:(const char*)varName forClass:(NSString*)className { 
     unsigned int varCount; 

     Class theClass = NSClassFromString(className); 
     Ivar *vars = class_copyIvarList(theClass, &varCount); 

     for (int i = 0; i < varCount; i++) { 
      Ivar var = vars[i]; 

      const char* name = ivar_getName(var); 
      if (strcmp(name, varName) == 0) { 
       ptrdiff_t offset = ivar_getOffset(var); 
       unsigned char* bytes = (unsigned char *)(__bridge void*)self; 
       free(vars); 
       return (bytes+offset); 
      } 

     } 



free(vars); 
     return NULL; 
    } 

И отливка значение:

NSInteger t = *(NSInteger*)[self getValueWithName:"p" forClass:@"ViewController"]; 
BOOL checkBool = *(BOOL*)[self getValueWithName:"boolean" forClass:@"ViewController"]; 
NSString *checkString = *((__unsafe_unretained NSString **)([self getValueWithName:"string" forClass:@"ViewController"])); 
+0

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

+0

Надеюсь, этот ответ вам поможет) – Volodymyr

+0

Спасибо! Это ответ, который я ожидаю. Мне нужно изучить этот код сейчас –

0

Я не уверен, если быть одноэлементно делает это отличается, но вот подобный вопрос.

В соответствии с этим постом вы можете.

Accessing private variables from an external class - iOS

Это своего рода старый, но я дам ему выстрелили.

В частности, эта линия

[object valueForKey:@"variable_name"];  
+0

Нет, singleton ничего не делает. Я просто хочу быстро показать вам, что могу получить экземпляр этого класса. Итак, вы можете забыть о синглетоне. –

+0

Но для использования 'valueForKey', мне нужно создать свойство для частной переменной, о которой я не спрашиваю. Я имею в виду, что я бы закончил с ошибкой во время выполнения «этот класс не является ключевым значением, совместимым с кодировкой для ключа» –

+0

Хорошо, я не был уверен. Сообщение не говорило, что вам нужно было сделать это первым. Возможно, вы не можете сделать это без аксессуаров или сделать его собственностью. Частные переменные предназначены для того, чтобы быть приватными, поэтому я предполагаю, что нет удобного способа доступа к ним. – Lucas

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