2013-06-12 121 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