iOS Runtime 运行时机制简单用法(一)

使用运行时我们需要导入#import <objc/runtime.h>
我们看下面代码,也就是用C实现简单的set和get 方法

//
//  NSObject+CategoryWithProperty.h
//  RunTimeTest
//
//  Created by plee on 15/10/8.
//  Copyright © 2015年 franklee. All rights reserved.
//

#import <Foundation/Foundation.h>
#import <objc/runtime.h>
@interface NSObject (CategoryWithProperty)
@property (nonatomic,strong) NSObject * property;

@end

//
//  NSObject+CategoryWithProperty.m
//  RunTimeTest
//
//  Created by plee on 15/10/8.
//  Copyright © 2015年 franklee. All rights reserved.
//

#import "NSObject+CategoryWithProperty.h"

@implementation NSObject (CategoryWithProperty)

- (NSObject *)property{
    return objc_getAssociatedObject(self, @selector(property));
}
- (void)setProperty:(NSObject *)property{
    objc_setAssociatedObject(self, @selector(property), property, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
    
}
@end

//
//  ViewController.m
//  RunTimeTest
//
//  Created by plee on 15/10/8.
//  Copyright © 2015年 franklee. All rights reserved.
//

#import "ViewController.h"
#import "NSObject+CategoryWithProperty.h"
@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    NSObject * object = [[NSObject alloc] init];
    object.property = @"123";
    NSLog(@"%@",object.property);
    
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

@end

  • objc_getAssociatedObject 相当于iOS内部的get方法
    OBJC_EXPORT id objc_getAssociatedObject(id object, const void *key)
    __OSX_AVAILABLE_STARTING(__MAC_10_6, __IPHONE_3_1);
  1. id object : 关联对象
  2. const void *key: 我们需要定义一个常量void * 类型的key
  • objc_setAssociatedObject 相当于iOS的属性的set方法

OBJC_EXPORT void objc_setAssociatedObject(id object, const void *key, id value, objc_AssociationPolicy policy)
__OSX_AVAILABLE_STARTING(__MAC_10_6, __IPHONE_3_1);

1.id object :被关联的对象
2.const void *key :char 类型的key
3.id value :要被赋值的值
4.objc_AssociationPolicy policy :runtime内存管理有一下集几种

  OBJC_ASSOCIATION_ASSIGN = 0,           /**< Specifies a weak reference to the associated object. */
  OBJC_ASSOCIATION_RETAIN_NONATOMIC = 1, /**< Specifies a strong reference to the associated object. 
                                          *   The association is not made atomically. */
  OBJC_ASSOCIATION_COPY_NONATOMIC = 3,   /**< Specifies that the associated object is copied. 
                                          *   The association is not made atomically. */
  OBJC_ASSOCIATION_RETAIN = 01401,       /**< Specifies a strong reference to the associated object.
                                          *   The association is made atomically. */
  OBJC_ASSOCIATION_COPY = 01403     
  • OBJC_EXPORT void objc_removeAssociatedObjects(id object)
    __OSX_AVAILABLE_STARTING(__MAC_10_6, __IPHONE_3_1);
    id object: 移除关联对象,用法不是很难,但是在使用中最好是合理使用,
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 转至元数据结尾创建: 董潇伟,最新修改于: 十二月 23, 2016 转至元数据起始第一章:isa和Class一....
    40c0490e5268阅读 1,776评论 0 9
  • 参数自一个指针,指向类的要接收消息的实例。 OP在处理该信息的方法的选择。 ......可变参数列表包含参数的方法...
    reallychao阅读 840评论 0 0
  • 运行时一看就是很牛逼的大牛使用的,我是小菜,只是来学习一下,分析一下使用方法,主要讲到 OBJC_EXPORT v...
    Raybon_lee阅读 13,881评论 23 7
  • Xcode release notes更新 定义了泛型取出非id,而是定义的泛型类型可以用点语法(id不可用点语法...
    沁晓Chr阅读 293评论 0 0
  • 经常看到代码中出现导入<objc/runtime.h>,但一直处于各种理由没有详细了解一下,今天在马上要回学校答辩...
    crushing阅读 1,968评论 0 1