如何使用Objective-C中的类别访问@private实例变量?

时间:2011-08-24 11:35:40

标签: objective-c ios categories instance-variables private-members

正如它在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”,引自:        - NSString + Utilities.o中的[UITextField(Editing)deleteBkw] ld:找不到架构i386的符号 collect2:ld返回1退出状态

2 个答案:

答案 0 :(得分:5)

NSString没有变量名称长度:

  

NSString类有两个原始方法-length和characterAtIndex: - 为其界面中的所有其他方法提供基础。 length方法返回字符串中Unicode字符的总数。 characterAtIndex:通过索引访问字符串中的每个字符,索引值从0开始。

所以你可以通过调用[self length]来访问length方法(而不是变量),只有这样才能访问。

答案 1 :(得分:0)

由于您在代码中向NSString类length添加方法,因此将替换为self.length.