ios拓展20-runtime添加一个类

作者: Abler | 来源:发表于2016-08-12 20:26 被阅读86次

由于昨天提到运行时,今天顺便讲解一下,不讲太多,不然篇幅太长,大家要么看不下去,要么容易晕

这里就不分层了,可以直接复制代码,方便运行,
@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    // 1.通过运行时添加一个类
    // 1.1设置类名
    const char *className = "MyClass";
    // 1.2通过类名获取类
    Class idClass = objc_getClass(className);
    // 1.3如果类不存在
    if(!idClass){
        // 创建运行类父类
        Class superClass = [NSObject class];   
        idClass = objc_allocateClassPair(superClass, className, 0);
        
    }

    // 2.为类添加方法(ios拓展29)
    IMP myimp = imp_implementationWithBlock(^(NSString *_self, NSString *str){
        NSLog(@"1");
        NSLog(@"%@-2-%@",_self,str);//_self没有打印
    });
    class_addMethod(idClass, @selector(did:), (IMP)myimp, "");

    /*
     BOOL class_addMethod(Class cls, SEL name, IMP imp, const char *types)
     
     参数说明:
     
     cls:被添加方法的类
     
     name:可以理解为方法名,这个貌似随便起名,比如我们这里叫sayHello2
     
     imp:实现这个方法的函数

     types:一个定义该函数返回值类型和参数类型的字符串,这个具体会在后面讲,
        =======>其实不填写好像也没问题<============
     */
    
    // 3 注册类 ()
    objc_registerClassPair(idClass);   
}

#pragma mark- 方法调用 -
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
    
    Class MyCls = NSClassFromString(@"MyClass");
    
    id instance = [MyCls new];
    
    [instance performSelector:@selector(did:) withObject:@"zhao"];//就算增加到2个参数,也只能打印一个
}

/*
class_addMethod(idClass, @selector(did:), (IMP)myimp, "v@@“);
 其中types参数为"v@@“,按顺序分别表示:
 
 v ==> 返回值类型void,若是i则表示int
 
 @ ==> 参数id(_self)
 
 @ ==> id(str)
 
 这些表示方法都是定义好的(Type Encodings),关于Type Encodings的其他类型定义请参考官方文档
 */
@end
运行结果
附其他方法:
// 添加成员变量
//    class_addIvar
    // 添加关联属性
//    class_addProperty
    // 添加协议
//    class_addProtocol
[Type Encodings](https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/ObjCRuntimeGuide/Articles/ocrtTypeEncodings.html)

相关文章

  • ios拓展20-runtime添加一个类

    由于昨天提到运行时,今天顺便讲解一下,不讲太多,不然篇幅太长,大家要么看不下去,要么容易晕 这里就不分层了,可以直...

  • iOS 类拓展与分类以及关联对象

    1、类拓展是匿名的分类。2、类拓展可以为类添加属性和方法(类拓展添加的属性和方法是私有的)。3、类拓展在编译时作为...

  • 类别和扩展

    类别(Category) 类别的作用 拓展当前类,为类添加方法拓展。 类别的局限性 无法向现有的类中添加新的实例变...

  • 类别、类拓展

    一、类别(运行时完成添加) 二、类拓展(编译时完成添加)

  • 类拓展和关联对象

    1. 类拓展和分类 category 类别/分类: 专门用来给类添加新的方法。 不能给类添加成员属性,添加了成员变...

  • 导航栏适配--translucent属性设置的问题

    iOS7及以上版本有改动,UITabBar类添加了一个translucent属性,UINavigationBar类...

  • iOS 类拓展的加载

    什么是类拓展呢? 类拓展就是一个匿名的分类。 类拓展 分类 类拓展的作用 给当前的类增加属性和方法。 类拓展何时加...

  • runtime常见问题

    1 . iOS runtime 运行时,动态添加属性方法首先, 要明白为什么要动态给类添加方法? 如果一个类方法很...

  • ios拓展29-runtime动态添加方法

    之前在ios拓展20(可以对照着看)里有讲过,添加类和方法实现.是直接在控制器里面实现的.如果类已经有了,只想动态...

  • iOS设计模式 ─── 行为拓展

    行为拓展,也就是为对象添加功能。如果接触设计模式之前,我们为一个对象添加新功能也就是直接在类里面添加对应代码,继承...

网友评论

    本文标题:ios拓展20-runtime添加一个类

    本文链接:https://www.haomeiwen.com/subject/pxjesttx.html