2013-06-26 3 views
0

Im делает настройку в theos, и вам нужно увидеть имена некоторых переменных.Есть ли способ увидеть, какие переменные объявлены внутри метода?

Say метод выглядит следующим образом:

- (UILabel*)makeALabel { 
    UILabel *name_that_i_want = [[UILabel alloc] init]; 
    [name_that_i_want setText:@"abcdefg"]; 
    return name_that_i_want; 
} 

Когда я смотрю через заголовки для этого метода, я хотел бы видеть:

-(id)makeALabel; 

Есть ли способ для меня, чтобы сбросить переменные, объявляется внутри этого метода, когда я подключаюсь к нему?

-(id)makeALabel { 
    %orig; 
    //somehow get name of the label declared 
    UILabel *label = MSHookIvar<UILabel *>(self, "name_that_i_want"); 
} 
+1

Я серьезно сомневаюсь. Локальные переменные оптимизируются компилятором и могут даже не существовать как отдельные объекты. –

+1

Почему, по-вашему, вам нужно увидеть имена местных жителей? – Kevin

ответ

1

Нет!

Необходимо знать значения переменных, объявленных в функции или методах или объекте, указывает на плохой дизайн. Против инкапсуляция является одним из трех основных принципов объектно-ориентированного программирования.

+0

И кроме того, он будет гнить ваши зубы. –

+0

@ Прошу прощения ... Я не понимаю. Боюсь, я тоже не знаю, смеетесь ли вы над моим ответом или со мной (что мы смеемся?). Если это первый, и вы считаете, что мой ответ неуместен - это очень хорошо может быть - я бы предпочел, чтобы вы сообщили мне прямо. :) –

+0

О, я просто получаю немного заусенцев под моим седлом, когда люди уходят на инкапсуляцию, и др. Инкапсуляция, безусловно, имеет свое место (и очень важное место), но есть определенные моменты, когда ее нужно выбросить из окна. Но в этом случае ОП просит что-то, что, вероятно, не имеет смысла (т. Е. Это не одно из тех определенных времен), и ему, вероятно, нужна небольшая «помощь», понимающая это. (Так что ответ - оба.) –

0

Ответ NO.

Что вы пытаетесь сделать, может быть выполнено путем изменения дизайна вашего требования, создав класс и ivars, которые вы можете использовать в методах, только для замены локальных переменных.

Затем вы можете использовать Objective-C Runtime для доступа к ivars/свойствам/методам класса.