`

ObjC Dynamic

 
阅读更多
原文: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、动态加载

根据参数,动态地加载资源……
-(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



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

http://superart.wikidot.com/chinese:iphone-nsclassfromstring
------------------------------------


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



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

用来做回调:http://www.wuleilei.com/blog/263
------------------------------------



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

来至:http://my.oschina.net/rareliu/blog/32022?catalog=86431
分享到:
评论

相关推荐

    @objc小结

    @objc dynamic var value: Int = 0 } ``` `@objc`还与Swift的自动合成有关。当Swift类继承自Objective-C的类,且Swift类中有一个与Objective-C父类同名的方法时,Swift会自动合成一个`@objc`方法,使得调用不会...

    ios-Model化数据.zip

    @objc dynamic var name: String? @objc dynamic var age: Int? } let user = UserModel() let dictionary = ["name": "John", "age": 30] user.setValue(dictionary, forKeyPath: "") ``` 这种方法减少了...

    swift-IceCream帮助您将Realm数据库与CloudKit同步

    @objc dynamic var name = "" @objc dynamic var age = 0 @IceCream() static var iceCream: IceCreamType = .cloudKit(container: "yourCloudKitContainerID") } ``` 在这段代码中,我们声明了一个名为 `User...

    iphone 开发基础控件UIButton

    例如,按钮被点击后改变文字或颜色,这可以通过KVO(Key-Value Observing)或者Swift的`@objc dynamic`属性来实现。 最后,不要忘记考虑按钮的响应区域。`frame`属性决定了按钮在屏幕上的位置和大小,`...

    静态库中使用xib

    在Objective-C中,可以使用`+load`方法,而在Swift中,可以使用`@objc dynamic`修饰符和`init?(coder:)`初始化器。注册的代码示例如下: ```objc + (void)initialize { [NSBundle loadNibNamed:@"MyView" owner:...

    swift-iOS基于消息转发机制实现弱引用计时器

    3. **Method Resolution**:如果依然无果,Swift会尝试通过`@objc dynamic`属性来寻找方法实现。 4. **Forwarding**:最后,如果以上所有尝试都失败,就会触发消息转发。 **二、实现弱引用计时器** 在iOS应用中,...

    ios-涉及到具体的个数的进度条.zip

    3. 添加KVO(Key-Value Observing)或者使用Swift的`@objc dynamic`属性来监听`totalCount`和`currentCount`的变化。当这两个值改变时,触发`setNeedsDisplay()`来重新绘制进度条。 4. 实现计算进度的方法,如`...

    IOS应用源码——当点击编辑器的时候,编辑器自动调整高度.zip

    2. **设置内容观察者**:为了监听文本内容的变化,可以为编辑器添加一个KVO(Key-Value Observing)观察者,或者使用Swift的`@objc dynamic`属性和`didSet`观察器。当文本内容改变时,触发回调更新高度约束。 3. **...

    swift-带有滑动弹性效果PageViewController

    8. 属性观察者:为了实时响应页面位置的变化,开发者可能会使用KVO(Key-Value Observing)或者Swift的`@objc dynamic`和`didSet`来监听和更新页面状态。 综上所述,"swift-带有滑动弹性效果PageViewController...

    swift-AOP来避免基类继承MVVMReactiveObjCJLRoutes组件化

    Objective-C中的一个常见实现是使用`Method Swizzling`,而在Swift中,可以通过`@objc dynamic`属性和`method_exchangeImplementations`函数实现类似效果。 2. **避免基类继承**: 基类继承通常会导致类层次结构...

    swift-精仿唱吧App音乐下载进度按钮完美快速集成使用

    Swift中也可以用`@objc dynamic`和`willSet/didSet`属性观察器实现类似功能。 现在,让我们看下`ZWMusicDownLoadView-master`这个压缩包中的资源。这个项目很可能包含了一个自定义的Swift类,名为`...

    ios实现viewcontroller切换传值的三种方法

    @objc dynamic var receiverKey: String? } ``` **3. 自定义初始化方法** 创建一个自定义的初始化方法,接受必要的参数,这样在创建ReceiverViewController实例时可以直接传递值。这种方法简单直接,但可能需要更...

    iOS MVVM架构

    @objc dynamic var username = "John Doe" } class ViewController: UIViewController { var viewModel = ViewModel() override func viewDidLoad() { super.viewDidLoad() observeViewModelChanges() } ...

    SyncEngine:在iCloud和Realm之间进行同步

    @objc dynamic var title: String = " " } AppDelegate application. registerForRemoteNotifications () syncEngine. register ( models : [SimpleNote. self ]) syncEngine. start () 同步 syncEngine.sync() ...

    InterposeKit:一个现代库,可在Swift中优雅地显示

    它以“纯” Swift 5.2编写有,和编写,可用于@objc dynamic Swift函数或Objective-C实例方法。 InterposeKit的灵感是中的,需要进行一些棘手的修改才能解决,我还在写下了。 该库不基于, 使用直接替换实现。 这...

    Realm-test

    每个属性都需要声明为`dynamic`,并标记为`@objc dynamic var`,以供 Realm 使用。 ```swift import RealmSwift class User: Object { @objc dynamic var name = "" @objc dynamic var email = "" } ``` 3. **...

    dojo-realm-intro:使用 Swift 探索 Realm 数据库

    这里,`@objc dynamic` 关键字用于指示 Realm 需要处理这些属性。一旦定义了数据模型,我们就可以像操作 Swift 对象一样操作 Realm 对象。 插入数据到 Realm: ```swift let user = User() user.name = "Alice" ...

    在Swift中使用KVO的细节以及内部实现解析(推荐)

    正确使用@objc和dynamic标记是关键,它们确保了Swift中类的属性可以被Objective-C的消息传递机制所访问,并且属性的setter方法可以被动态生成,从而使KVO能够正常工作。需要注意的是,虽然Swift带来了现代编程语言的...

    RealmHackatonTask:iOS领域实践

    @objc dynamic var email = "" } ``` 3. **初始化Realm**: 在需要使用Realm的地方,创建一个`Realm`实例。通常在`AppDelegate`中初始化并用于整个应用程序。 ```swift let realm = try! Realm() ``` 4. **插入和...

Global site tag (gtag.js) - Google Analytics