码迷,mamicode.com
首页 > 其他好文 > 详细

2-1 OC 类别(分类)

时间:2018-05-19 10:40:03      阅读:199      评论:0      收藏:0      [点我收藏+]

标签:static   使用   nsstring   自己   value   mem   报错   atom   特点   

一、类别的作用

1.声明私有方法。

2.分解体积庞大的类文件。

3.把Framework私有方法公开。

 

二、类别的特点

1.运行时决议。

2.可以为系统类添加类别。(区别于扩展)

 

三、类别中可以添加什么

1.实例方法。

2.类方法。

3.协议。

4.属性。

类别并不是不可以扩展属性的,只不过类别中不可以直接添加成员变量(实例变量)而已(第5点解决该问题)。

在类别中为属性添加set/get方法,在set方法里面赋值的时候找不到赋值的对象,也就是说系统没有为我们生成带下划线的成员变量,没生成我们就自己加,一加就报错,这才是类别不能扩展属性的根本原因。

5.实例变量(通过关联对象可以添加)。

//UINavigationController+Cloudox.h文件
#import <UIKit/UIKit.h>

@interface UINavigationController (Cloudox)

@property (copy, nonatomic) NSString *cloudox;

@end

//UINavigationController+Cloudox.m文件
#import "UINavigationController+Cloudox.h"
#import <objc/runtime.h>

@implementation UINavigationController (Cloudox)

//定义常量 必须是C语言字符串
static char *CloudoxKey = "CloudoxKey";

-(void)setCloudox:(NSString *)cloudox{
    /*
     objc_AssociationPolicy参数使用的策略:
     OBJC_ASSOCIATION_ASSIGN;            //assign策略
     OBJC_ASSOCIATION_COPY_NONATOMIC;    //copy策略
     OBJC_ASSOCIATION_RETAIN_NONATOMIC;  // retain策略

     OBJC_ASSOCIATION_RETAIN;
     OBJC_ASSOCIATION_COPY;
     */
    /*
     关联方法:
     objc_setAssociatedObject(id object, const void *key, id value, objc_AssociationPolicy policy);

     参数:
     * id object 给哪个对象的属性赋值
     const void *key 属性对应的key
     id value  设置属性值为value
     objc_AssociationPolicy policy  使用的策略,是一个枚举值,和copy,retain,assign是一样的,手机开发一般都选择NONATOMIC
     */

    objc_setAssociatedObject(self, CloudoxKey, cloudox, OBJC_ASSOCIATION_COPY_NONATOMIC);
}

-(NSString *)cloudox{
    return objc_getAssociatedObject(self, CloudoxKey);
}


@end

 

四、加载调用栈

以方法为例:分类数组里有方法数组(二维数组),将类别方法拼接到原类的方法列表中实现如下:

1.总数 = 旧+新。

2.内存分配新总数(调整Array的存储)。

3.设置新总数。

4.memmove操作(Array结构):【【】,【】,【】,【原有方法列表一】,【原油方法列表二】】。

5.memcpy内存拷贝(Array结构):【【新A类别方法列表】,【新B类别方法列表】,【新C类别方法列表】,【原有方法列表一】,【原油方法列表二】】。

注意1:同一个类的两个分类有同名方法哪个生效?

答:最后编译的分类的方法生效(原因:调取方法列表倒序调用)。

注意2:分类“覆盖”(不是替换,方法都会保留)原有宿主类方法,由于分类方法被放到前面所以会出现这种情况,即分类方法优先被实现。

注意3:名字相同的分类会编译报错。

2-1 OC 类别(分类)

标签:static   使用   nsstring   自己   value   mem   报错   atom   特点   

原文地址:https://www.cnblogs.com/weiboyuan/p/9059209.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!