对象模型

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController
@end

#import "ViewController.h"
#import <objc/runtime.h>
@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    //动态建立对象
    //建立一个名为DemoCustomView的类 它是UIView的子类
    Class newClass = objc_allocateClassPair([UIView class], "DemoCustomView", 0);
    
    //为该类增长一个名为report的方法
    class_addMethod(newClass, @selector(report), (IMP)ReportFunction, "v@:");
    
    //注册该类
    objc_registerClassPair(newClass);
    
    //建立一个DemoCustomView类的实例
    id instanceOfNewClass = [[newClass alloc]init];
    
    //调用report方法
    [instanceOfNewClass performSelector:@selector(report)];
}
void ReportFunction(id self,SEL _cmd){
    NSLog(@"This object is %p",self);
    NSLog(@"Class is %@,and super is %@",[self class],[self superclass]);
    
    Class currentClass = [self class];
    for (int i = 1;i<5;i++){
        NSLog(@"Following the isa pointer %d times gives %p",i,currentClass);
        currentClass = object_getClass(currentClass);//得到对象的isa指针所指向的对象
    
    }
    NSLog(@"NSObject's class is %p",[NSObject class]);
    NSLog(@"NSObject's meta class is %p",object_getClass([NSObject class]));

    /*
     2016-04-27 14:43:59.683 OC对象模型[11609:1157519] This object is 0x7fd208c2fe10
     2016-04-27 14:43:59.684 OC对象模型[11609:1157519] Class is DemoCustomView,and super is UIView
     2016-04-27 14:43:59.684 OC对象模型[11609:1157519] Following the isa pointer 1 times gives 0x7fd208c19080
     2016-04-27 14:43:59.684 OC对象模型[11609:1157519] Following the isa pointer 2 times gives 0x7fd208c32c70
     2016-04-27 14:43:59.684 OC对象模型[11609:1157519] Following the isa pointer 3 times gives 0x1008f6198
     2016-04-27 14:43:59.684 OC对象模型[11609:1157519] Following the isa pointer 4 times gives 0x1008f6198
     2016-04-27 14:43:59.684 OC对象模型[11609:1157519] NSObject's class is 0x1008f6170
     2016-04-27 14:43:59.684 OC对象模型[11609:1157519] NSObject's meta class is 0x1008f6198
     */
}
- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

@end
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
@interface ImagePickerReplaceMethodsHolder : NSObject
-(BOOL)shouldAutorotate;
-(UIInterfaceOrientation)preferredInterfaceOrientationForPresentation;
@end

#import "ImagePickerReplaceMethodsHolder.h"

@implementation ImagePickerReplaceMethodsHolder
-(BOOL)shouldAutorotate{
    return  NO;
}

-(UIInterfaceOrientation)preferredInterfaceOrientationForPresentation{
    return UIInterfaceOrientationPortrait;
}
@end
#import <UIKit/UIKit.h>

@interface ImagePickerViewDemo : UIImagePickerController

@end
#import "ImagePickerViewDemo.h"
#import "ImagePickerReplaceMethodsHolder.h"
#import <objc/runtime.h>
#define SYSTEM_VERSION_CREATE_THAN_OR_EQUAL_TO(v)  ([[[UIDevice currentDevice] systemVersion]compare:v options:NSNumericSearch] != NSOrderedAscending)
#define SYSTEM_VERSION_LESS_THAN(v) ([[[UIDevice currentDevice] systemVersion]compare:v options:NSNumericSearch] == NSOrderedAscending)
@implementation ImagePickerViewDemo
-(void)load{
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken,^{
    
        [self hackForImagePicker];
    });

}

-(void)hackForImagePicker{
    //iOS swizzling的应用
    //动态替换类方法或实例方法
    //API
    //1.  class_replaceMethod 替换类方法的定义
    //2.  method_exchangeImplementations 交换两个方法的实现
    //3.  method_setImplementation 设置一个方法的实现
    if (SYSTEM_VERSION_CREATE_THAN_OR_EQUAL_TO(@"6.0") && SYSTEM_VERSION_LESS_THAN(@"6.1")){
    
        Method oldMethod1 = class_getInstanceMethod([UIImagePickerController class], @selector(shouldAutorotate));
        Method newMethod1 = class_getInstanceMethod([ImagePickerReplaceMethodsHolder class], @selector(shouldAutorotate));
        method_setImplementation(oldMethod1, method_getImplementation(newMethod1));
        
        Method oldMethod2 = class_getInstanceMethod([UIImagePickerController class], @selector(preferredInterfaceOrientationForPresentation));
        Method newMethod2 = class_getInstanceMethod([ImagePickerReplaceMethodsHolder class], @selector(preferredInterfaceOrientationForPresentation));
        method_setImplementation(oldMethod2, method_getImplementation(newMethod2));
        
    }
 
}
@end
#import <Foundation/Foundation.h>

@interface Father : NSObject

@end
#import "Father.h"

@implementation Father
{
    int _father;
}
@end
#import "Father.h"

@interface Son : Father

@end
#import "Son.h"

@implementation Son
{
    int _son;
}
@end
#import <UIKit/UIKit.h>
#import "AppDelegate.h"
#import "Son.h"
int main(int argc, char * argv[]) {
    Son *son = [[Son alloc]init];
    /* 控制台打印
     (lldb) p *son
     (Son) $2 = {
     Father = {
     NSObject = {
     isa = Son
     }
     _father = 0
     }
     _son = 0
     }
     */
    @autoreleasepool {
        return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
    }
}
相关文章
相关标签/搜索