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

3
根据苹果的文档所述:http://developer.apple.com/library/mac/#documentation/cocoa/Conceptual/ObjectiveC/Chapters/ocCategories.html#//apple_ref/doc/uid/TP30001163-CH20-SW1,类别不能为类声明额外的实例变量; 它只包括方法。但是,类范围内的所有实例变量也在类别范围内。这包括类声明的所有实例变量,甚至包括使用@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:找不到符号(s)以i386为架构 collect2:ld返回1个退出状态

你尝试过添加 #import <UIKit/UIKit.h> 吗? - Adam Rosenfield
我刚刚添加到我的NSString+Utilities.h文件中。然而,相同的错误仍然存在。 - docchang
2个回答

5

NSString没有变量名长度:

NSString类有两种基本方法-length和characterAtIndex:-这两个方法提供了其接口中所有其他方法的基础。length方法返回字符串中Unicode字符的总数。通过索引值0,characterAtIndex:可以访问字符串中每个字符。

因此,您可以通过调用[self length]来访问length方法(而不是变量),只能通过这种方式。


0

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


抱歉,我的上一个NSString示例不太好。我已经更新了一个使用UITextField的新示例。 - docchang

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接