我正在研究Objective-C,我想知道它是否有反射的概念。我迄今發現的文件都沒有描述反思。Objective-C是否有反思?
回答
Runtime Reference中描述的運行時功能不僅可以查詢類或實例的功能,還可以添加方法,甚至可以在運行時創建新類。我說這是一種非常動態的反思,對於基於C的語言來說通常是不可用的。 Mike Ash's wrappers是一個圍繞它的Objective-C包裝。再次,它甚至可以添加方法!可可的基類,NSObject
,也爲許多運行時功能提供包裝,參見NSObject
protocol reference。例如,
[foo respondsToSelector:@selector(bar:)];
if([foo isKindOfClass:[NSString class]]){ ... }
做什麼方法名稱說。您甚至可以即時添加方法。例如,
#import <Foundation/Foundation.h>
#import <objc/runtime.h>
@interface Foo:NSObject
{
}
@end
@implementation Foo
-(void)sayHi
{
NSLog(@"Hi! from %@",NSStringFromSelector(_cmd));
}
+(BOOL)resolveInstanceMethod:(SEL)sel
{
Method method=class_getInstanceMethod(self,@selector(sayHi));
class_addMethod(self,sel,method_getImplementation(method),method_getTypeEncoding(method));
return YES;
}
@end
int main(){
NSAutoreleasePool*pool=[[NSAutoreleasePool alloc] init];
Foo* foo=[[Foo alloc] init];
[foo aeiou];
[foo bark];
[foo mew];
[pool drain];
return 0;
}
這將產生輸出
Hi! from aeiou
Hi! from bark
Hi! from mew
它的作用是如下:
SEL
是代表發送消息中的變量(或方法調用,在其他術語)。- 如果發送到實例的消息不是實現,則Objective-C運行時調用
resolveInstanceMethod:
類因此,在這種情況下,我只是將一個名爲sayHi
的預定義方法的實現複製到該方法的實現中。 - 從該方法中,您可以使用
_cmd
來查看調用該方法時使用的選擇器。所以,即使從一個單一的sayHi
實現,我們可以得到不同的輸出。
一些標準的Cocoa實現(特別是鍵值編碼,鍵值觀察和核心數據)使用運行時動態修改類。
我想我不知道你在找什麼方面的反射。你在尋找如何確定給定變量是哪個類?如果是這樣,檢查了這一點:Objective-C class -> string like: [NSArray className] -> @"NSArray"
// Get a object's class name
if ([NSStringFromClass([foo class]) compare:@"NSSomeObject"] == NSOrderedSame) {...}
// Does an object have a method
[foo respondsTo:@selector(method:)]
您正在尋找的不僅僅是這一點?
哦!我的經理需要研究關於抽象類和Objetive-C中的反射。我試圖找出但沒有結果,所以我必須問大家:(。 P/S:非常感謝。 –
呃?是否與你的工作有關?你需要付給我們部分工資:) – Yuji
@ Yuji。呵呵 。好的:P –
是的,Objective-C有反射(和抽象類)。這種反射是否符合你的需求是一個不同的問題。
Objective-C中的反射對於C派生語言來說是非常靈活的。你可以問一個類它實現了什麼方法,或者你可以修改和/或添加方法到現有的類。您甚至可以隨時創建新類或隨時更改任何實例的類。
典型Objective-C的程序確實沒有任何東西論文(至少不直接地)保存偶爾主叫respondsToSelector:
或conformsToProtocol:
。雖然Objective-C是一種完全動態的,反思的,面向對象的語言,但這並不意味着鼓勵或通常使用這種模式。
你可能會發現我的這些問題的答案有趣:
In Objective C, how to find out the return type of a method via reflection?
Does Objective-C have a Standard Library?
Smalltalk runtime features absent on Objective-C?
,當然,運行時間是very well documented。正如the language。或者你可以read the source。
你有什麼想法如何設置實際屬性,一旦你找到它使用反射?我在這裏有一個問題:http://stackoverflow.com/q/25538890/1735836 – Patricia
- 1. 沒有反思是否有可能確定類運行
- 2. NHibernate沒有反思?
- 3. 是否有「反向」的NSPredicate
- 4. 是否有替代StringUtils.isNumeric的意思呢?
- 5. 是否可以反思性檢查java中的內存泄漏?
- 6. 反思找出屬性是否爲期權類型
- 7. 龍目島建設者是否使用反思?
- 8. 設計scala庫時,我們是否需要避免反思?
- 9. Oracle Forms 6或更高版本是否存在反思?
- 10. 與反思
- 11. 反思:從
- 12. 反思與WCF
- 13. 反思inhertited類
- 14. 反思級Java
- 15. 與反思
- 16. 反思警告
- 17. 反思,調用
- 18. MEF與反思
- 19. 反思testNG
- 20. 反思的LINQ
- 21. 反思從DTO
- 22. 反思的ExpandoObject
- 23. 與反思
- 24. 什麼是ObjectiveC中的retainCount?
- 25. 反射是否違反LSP?
- 26. ^意思是在反應本地package.json
- 27. 反斜槓跟grep是什麼意思?
- 28. 是Java反思不好的做法?
- 29. AD反思 - 它是如何工作的?
- 30. 反撥選項是什麼意思?
請參閱http://en.wikipedia.org/wiki/Objective-C –
Objective-C具有比Java更強大的反射能力。您可以從[Apple的Objective-C運行時編程指南]瞭解更多信息。(http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/ObjCRuntimeGuide/Introduction/Introduction.html#//apple_ref/doc/uid/TP40008048) – venj
感謝「ott」和「venj」。 –