ObjC Dynamic

[url=http://www.onevcat.com/2012/04/objective-c-runtime/]原文[/url]:http://www.onevcat.com/2012/04/objective-c-runtime/


动态类型(Dynamic typing)
动态绑定(Dynamic binding)
动态加载(Dynamic loading)

1、动态类型

而在实际使用中,往往使用introspection来确定该对象的实际所属类:

id obj = someInstance;
if ([obj isKindOfClass:someClass])
{
someClass *classSpecifiedInstance = (someClass *)obj;
// Do Something to classSpecifiedInstance which now is an instance of someClass
//...
}



2、动态绑定
确定实例所属的类后,将某些属性和相应的方法绑定到实例上。
来确定对象是否可以对某个SEL做出响应。

Special Considerations
This method is called before the Objective-C forwarding mechanism is invoked. If respondsToSelector: or instancesRespondToSelector: is invoked, the dynamic method resolver is given the opportunity to provide an IMP for the given selector first.

void dynamicMethodIMP(id self, SEL _cmd)
{
// implementation ....
}

//该方法在OC消息转发生效前被调用
+ (BOOL) resolveInstanceMethod:(SEL)aSEL
{
if (aSEL == @selector(resolveThisMethodDynamically))
{
//向[self class]中新加入返回为void的实现,SEL名字为aSEL,实现的具体内容为dynamicMethodIMP
class_addMethod([self class], aSEL, (IMP) dynamicMethodIMP, "v@:");
return YES;
}
return [super resolveInstanceMethod:aSel];
}


3、动态加载

[b]根据参数,动态地加载资源……[/b]
-(NSArray *)loadPadNibNamed:(NSString *)name owner:(id)owner options:(NSDictionary *)options 
{
NSString *newName = [name stringByReplacingOccurrencesOfString:@"@pad" withString:@""];
newName = [newName stringByAppendingFormat:@"@pad"];

//判断是否存在
NSFileManager *fm = [NSFileManager defaultManager];
NSString* filepath = [[NSBundle mainBundle] pathForResource:newName ofType:@"nib"];

//这里调用的loadPadNibNamed:owner:options:实际为为交换后的方法,即loadNibNamed:owner:options:
if ([fm fileExistsAtPath:filepath]) {
return [self loadPadNibNamed:newName owner:owner options:options];
} else {
return [self loadPadNibNamed:name owner:owner options:options];
}
}



//OC
Class c = NSClassFromString(@"Name");
//Java,忘光了~
Class c = Class.forName("Name");
URLClassLoader



[size=medium]NSClassFromString的好处是:
1 弱化连接,因此并不会把没有的Framework也link到程序中。
2 不需要使用import,因为类是动态加载的,只要存在就可以加载。因此如果你的toolchain中没有某个类的头文件定义,而你确信这个类是可以用的,那么也可以用这种方法。

[url]http://superart.wikidot.com/chinese:iphone-nsclassfromstring[/url]
------------------------------------[/size]


SEL selfunc = NSSelectorFromString(NSString *str); //方法名称
if ([object respondsToSelector:selfunc]) { //判断方法是否存在
[object performSelector:selfunc]; //执行方法


[size=medium]
一开始感觉不出有什么用,直接传对象或者protocol就可以了。
这样能更放荡,用的所谓的oo思想,把所有对象都抽象为Object,
和上面的NSClassFromString是一种思想,从具象到相对抽象

用来做回调:[url]http://www.wuleilei.com/blog/263[/url]
------------------------------------
[/size]



#import <objc/runtime.h> //重点
NSString *str;
Mobj *obj = [[Mobj alloc] init]; //Mobj中有一私有属性NSString *mt_;
object_getInstanceVariable(obj, "mt_", (void *)&str);
NSLog(@"%@",str);
[obj release];

来至:[url]http://my.oschina.net/rareliu/blog/32022?catalog=86431[/url]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值