iOS之runtimeios开发程序员

运行时相关

2015-12-21  本文已影响606人  Tuberose
#import <Foundation/Foundation.h>


@interface CYPerson : NSObject
{
    int _money;
}
@property (nonatomic, assign, readonly) int age;
@property (nonatomic, assign) double height;
@property (nonatomic, copy) NSString *name;
@property (nonatomic, strong) NSArray *books;
@property (nonatomic, strong) id test;
@property (nonatomic, assign) CGRect rect;
@property (nonatomic, copy) void (^block)();
@property (nonatomic, assign) int *p;
@property (nonatomic, strong) CYCat *cat;
@end
#import "CYPerson.h"

@implementation CYPerson

@end
#import <Foundation/Foundation.h>
#import <objc/runtime.h>
#import "CYPerson.h"

void getIvars()
{
    unsigned int count = 0;
    Ivar *ivars = class_copyIvarList([CYPerson class], &count);
    // class_copyIvarList获取成员变量列表,它返回的是一个指针指向的是最前面的那一个
    // ([CYPerson class], &count)这里面放的是类,你把类给我,我就获取里面所有的成员变量。&count放的是成员变量的个数
    for (int i = 0; i < count; i++) {
        // for循环把所有成员变量遍历出来
        Ivar ivar = ivars[i]; // *(ivars + i)
        // 取出每一个成员变量Ivar,而且Ivar是以数组的形式去访问
        // ivars[i]的写法相当于*(ivars + i)---跳到下一个,取出这个指针指向的东西
        NSLog(@"%s %s", ivar_getName(ivar), ivar_getTypeEncoding(ivar));
       // %s是因为这里是C语言的东西
       // ivar_getName(ivar)这是去获取所有成员变量的名字,这样就挖掘到了所有成员变量
       // ivar_getTypeEncoding(ivar)表示获取一个成员变量的类型字符串
       // 而且今后如果你有要获取所有什么double,int类型的成员变量,这种方式,一打印就出来了
    }

    free(ivars);
    // 这里是通过copy出来的,所以需要释放的
}

// 这里获取所有属性,和上面一样
int main(int argc, const char * argv[]) {
    @autoreleasepool {
        unsigned int count = 0;
        objc_property_t *properties = class_copyPropertyList([CYPerson class], &count);
        // class_copyPropertyList获取属性列表
        // class_copyProtocolList([CYPerson class], &count);是获取协议列表,这样可以获取这个类遵循的所有协议
        // class_copyMethodList([CYPerson class], &count);是获取方法列表,这样可以知道这个类遵循 那些方法
        for (int i = 0; i < count; i++) {
            objc_property_t property = properties[i];
            NSLog(@"%s   ----     %s", property_getName(property), property_getAttributes(property));
       // property_getName(property)这是去获取所有属性的名字
       // property_getAttributes(property)获取所有属性的类型
        }

        free(properties);

//        method_exchangeImplementations(<#Method m1#>, <#Method m2#>)
//        方法交换---这个方法的意义在于我可以将苹果系统内部的方法替换成我自己的方法。当你认为系统自带的方法不好用时,你就将它替换为自己的方法
    }
    return 0;
}

*


*

*


*

*


*

*


*

        method_exchangeImplementations(<#Method m1#>, <#Method m2#>)
//      方法交换---这个方法的意义在于我可以将苹果系统内部的方法替换成我自己的方法。当你认为系统自带的方法不好用时,你就将它替换为自己的方法





#import <Foundation/Foundation.h>

@interface CYPerson : NSObject
- (void)run;
- (void)study;
@end
#import "CYPerson.h"
@implementation CYPerson

- (void)run
{
    NSLog(@"%s", __func__);
}

- (void)study
{
    NSLog(@"%s", __func__);
}

@end
#import "ViewController.h"
#import "CYPerson.h"
#import <objc/runtime.h>

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

        Method method1 = class_getInstanceMethod([CYPerson class], @selector(run));
        Method method2 = class_getInstanceMethod([CYPerson class], @selector(study));
        method_exchangeImplementations(method1, method2);


        CYPerson *p = [[CYPerson alloc] init];
        [p run];

        [p study];

#import <UIKit/UIKit.h>
#import <objc/runtime.h>

@implementation UIViewController (CYExtension)
+ (void)load
{
    Method method1 = class_getInstanceMethod(self, NSSelectorFromString(@"dealloc"));
    Method method2 = class_getInstanceMethod(self, @selector(CY_dealloc));
    method_exchangeImplementations(method1, method2);
}

- (void)CY_dealloc
{
    NSLog(@"%@ - CY_dealloc", self);
}
@end

- (void)dealloc
{
    NSLog(@"-------dealloc");
}
- (void)dealloc
{
    NSLog(@"-------dealloc");

        self.data = nil;
        self.images = nil;

        [self cancel];
}
- (void)CY_dealloc
{
    NSLog(@"%@ - CY_dealloc", self);

        [self CY_dealloc];
        //  这样调用的是dealloc,又调回去了
}
    NSString *value = nil;

    NSMutableDictionary *dict = [NSMutableDictionary dictionary];
    //    dict[@"name"] = value;

    NSMutableArray *array = [NSMutableArray array];
    [array addObject:value];
    array[0] = value;

上一篇 下一篇

猜你喜欢

热点阅读