Какие имена генерируются для переменных свойств без явных объявлений?

Этот вопрос связан с подключением к 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


person n00neimp0rtant    schedule 03.02.2012    source источник
comment
Я предполагаю, что имя каждого из них начинается с подчеркивания _xxxx. но вам нужно будет добавить их в реализацию ниже. _тип. Одна вещь, которую я знаю, это то, что вам не нужно сохранять ключевое слово в свойстве для значений int, поскольку они не являются nsobjects.   -  person peterept    schedule 03.02.2012


Ответы (1)


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

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

person Adam Wright    schedule 03.02.2012
comment
Я только что сделал это и распечатал все переменные: type Ti,R,N,V_type leftOrder Ti,R,D,N rightOrder Ti,R,D,N priority Ti,R,D,N Похоже, они не У меня даже нет имен. - person n00neimp0rtant; 03.02.2012