Какие имена генерируются для свойства ivars без явных объявлений? - PullRequest
1 голос
/ 03 февраля 2012

Этот вопрос касается перехвата с помощью Mobile Substrate, но, пока вы знаете Objective-C, вы, вероятно, можете помочь.

У меня есть этот класс, который я выбросил из UIKit. Вот часть этого:

@interface UIStatusBarItem : NSObject {
     int _type;
}
@property(nonatomic, readonly, retain) int type;
@property(nonatomic, readonly, retain) int leftOrder;
@property(nonatomic, readonly, retain) int rightOrder;
@property(nonatomic, readonly, retain) int priority;

...

@end

Естественно, если бы я хотел установить int type, например, 16, я бы сделал:

MSHookIvar<int>(self, "_type") = 16;

С тех пор [self type] вернется 16. Это я знаю.

Моя проблема в том, что я не знаю, как компилятор "называет" int, где хранятся значения для int leftOrder, int rightOrder и int priority. Я попробовал:

MSHookIvar<int>(self, "leftOrder")

но это неправильно и вылетает телефон. Все, что мне действительно нужно знать, - это как эти переменные называются автоматически, если вы сами их не указали. Спасибо

Кроме того, я ненавижу звучать как укол, но, пожалуйста, не отвечайте просто "не делай этого, это небезопасно". Я знаю, что это не так, и поэтому большинство моих продуктов в Cydia, а не в App Store = P

1 Ответ

3 голосов
/ 03 февраля 2012

Поддерживающие ивары обычно называются так же, как и свойство.Без подробностей я понятия не имею, почему это разбилось.Вы можете проверить во время выполнения, каковы имена, используя property_getAttributes из среды выполнения Objective C (использовав class_copyPropertyList для получения свойств из класса).

Кроме того, чтобы не звучать слишкомбольно, даже в Cydia вы не должны делать принципиально небезопасных вещей.Надежность программного обеспечения для пользователей так же важна в стороннем магазине приложений, как и в официальном.

...