Category 动态添加属性

本文介绍如何利用iOS运行时机制为Category添加属性。通过objc_setAssociatedObject和objc_getAssociatedObject方法,可在运行时动态地为现有类添加属性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

了解OC的都应该知道,在一般情况下,我们是不能向Category中添加属性的,只能添加方法,但有些情况向,我们确实需要向Category中添加属性,而且很多系统的API也有一些在Category添加属性的情况。


iOS运行时机制简介

iOS运行时机制,简单来说,就是苹果给开发这提供的一套在运行时动态创建类、添加属性/方法(不止这些,还有一些其他功能)的API,它是一套纯C语言的API,使用相应的API就可以通过Category给一个原本存在的类添加属性。

//

//  NSObject+Extension.h

//  Target-Action

//

//  Created by ChenQing on 16/4/24.

//  Copyright © 2016 ChenQing. All rights reserved.

//


#import <Foundation/Foundation.h>


@interface NSObject (Extension)


@property (strong,nonatomic) NSDictionary *userInfo;


@end



//

//  NSObject+Extension.m

//  Target-Action

//

//  Created by ChenQing on 16/4/24.

//  Copyright © 2016 ChenQing. All rights reserved.

//


#import "NSObject+Extension.h"

#import <objc/runtime.h>

@implementation NSObject (Extension)


-(void)setUserInfo:(NSDictionary *)userInfo{

    objc_setAssociatedObject(self, @"userInfo", userInfo, OBJC_ASSOCIATION_RETAIN_NONATOMIC);

 //#import <objc/runtime.h>头文件
    //objc_setAssociatedObject需要四个参数:源对象,关键字,关联的对象和一个关联策略。
     
    //1 源对象self
    //2 关键字 唯一静态变量key associatedkey
    //3 关联的对象 userInfo
    //4 关键策略  OBJC_ASSOCIATION_ASSIGN
//    enum {
//        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          /**< Specifies that the associated object is copied.
//                                                *   The association is made atomically. */
//    };

}


-(NSDictionary *)userInfo{

//通过 objc_getAssociatedObject获取关联对象

    return objc_getAssociatedObject(self, @"userInfo");

}


@end


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值