Как получить доступ к переменной экземпляра @private, используя категорию в Objective-C?

Как указано в документации Apple: http://developer.apple.com/library/mac/#documentation/cocoa/Conceptual/ObjectiveC/Chapters/ocCategories.html#//apple_ref/doc/uid/TP30001163-CH20-SW1

Note that a category can’t declare additional instance variables for the class; it includes only methods. However, all instance variables within the scope of the class are also within the scope of the category. That includes all instance variables declared by the class, even ones declared @private.

Однако, когда я пытался получить доступ к закрытой переменной экземпляра UITextField "_selectionRange", я получаю символ не найден. Ниже приведены мой исходный код и сообщение об ошибке для вашей справки. Я прошу прощения за тех, кто прочитал мой последний пример "NSString". Это был плохой пример, поскольку в классе NSString нет переменных экземпляра @private.

NSString + Utilities.h

#import <Foundation/Foundation.h>
@interface UITextField (Editing)
- (void)deleteBkw;
@end

NSString + Utilities.m

@implementation UITextField (Editing)
- (void)deleteBkw {
    NSLog(@"%d:%d", _selectionRange.location, _selectionRange.length);
}
@end

Ошибка: неопределенные символы для архитектуры i386: "_OBJC_IVAR_$_UITextField._selectionRange", на которую ссылаются из: -[UITextField(Editing) deleteBkw] в NSString+Utilities.o ld: символы (символы) не найдены для архитектуры i386 collect2: ld вернул 1 выход статус

2 ответа

NSString не имеет длины имени переменной:

Класс NSString имеет два примитивных метода - length и characterAtIndex: - которые обеспечивают основу для всех других методов в его интерфейсе. Метод length возвращает общее количество символов Unicode в строке. characterAtIndex: предоставляет доступ к каждому символу в строке по индексу со значениями индекса, начинающимися с 0.

Таким образом, вы можете получить доступ к методу длины (а не к переменной), вызвав [self length] и только так.

Так как вы добавляете методы в класс NSString length в вашем коде должно быть заменено self.length.

Другие вопросы по тегам