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

Как указано в документации 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 ]

5 голосов
/ 24 августа 2011

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

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

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

0 голосов
/ 24 августа 2011

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

...