2013-06-12 66 views
1

因为用于基础类的.m文件(地说的NSString)是不可用的,我在想,如果我可以宣布延期,在同一类中声明一个类的.m文件里面。我成功地创建了一个不使用任何实例变量的私有方法。但是,当我尝试访问在界面中声明的iVar时,它导致了问题。
*这没有一个目的,这样,只是想出来的东西。扩展为一个基础类

我所做的就是在NSString声明一个类:

的NSString + TestInterface.h

@interface NSString (TestInterface) 
@end 

的NSString + TestInterface.m

@interface NSString() { 

    NSString *myVar; 
} 
@property (strong) NSString *myVar; 
-(void)myPrivateMethod; 
@end 


@implementation NSString (TestInterface) 
-(void)myPrivateMethod{ 
    [email protected]"random"; 
// [self setValue:@"check" forKey:@"myVar"]; 

    NSLog(@"Private %@",myVar); 
// NSLog(@"Private %@",[self valueForKey:@"myVar"]); 
} 

@end 

当我做这样我得到以下编译器错误:

Undefined symbols for architecture x86_64:
"_OBJC_IVAR_$_NSString.myVar", referenced from: -[NSString(TestInterface) myPrivateMethod] in NSSTring+TestInterface.o ld: symbol(s) not found for architecture x86_64

有人能告诉我发生了什么事吗?

回答

2

您只能在其中原来,类的主要执行驻留在同一个翻译单元(文件)使用类扩展定义新的实例变量。这意味着你不能有效地添加实例变量的类你没有源代码。

+0

好的。但为什么'setValue:ForKey:'在'valueForKey:'时会抛出异常? – Rakesh

+0

@Rakesh IDK。我刚刚尝试过,对我而言,它确实引发了一个例外。 – 2013-06-12 12:39:21

+0

可能是我的粗心大意,它也给我带来了不便。谢谢。 – Rakesh

4

你不能在你没有自己的实现(.m文件)外国类的扩展/类别中添加实例变量。

你当然可以补充一点,作为setter和getter方法。对于acutal值的存储,您可以利用objc_setAssociatedObject的是某种形式的全球存储在哪里,你的值与键和一个对象的实例相关联。

这是很好的说明,讨论并exaples给出:What is objc_setAssociatedObject() and in what cases should it be used?

+0

谢谢。我不知道'objc_setAssociatedMethod'。 +1 – Rakesh