美文网首页
分类和扩展区别

分类和扩展区别

作者: Queen_BJ | 来源:发表于2020-09-08 14:03 被阅读0次
    分类

    作用
    1、声明私有方法
    2、分解体积庞大的类文件
    3、还可以添加实例方法,类方法,协议,属性(添加getter和setter方法,并没有实例变量,添加实例变量需要用关联对象
    特点
    为系统类添加方法

    • 分类能添加成员变量吗?
      不能。只能通过关联对象(objc_setAssociatedObject)来模拟实现成员变量
    • 如果工程里有两个分类A和B,两个分类中有一个同名的方法,哪个方法最终生效?
      取决于分类的编译顺序,最后编译的那个分类的同名方法最终生效(因为在动态添加类的方法的时候是倒序遍历方法列表的,最后编译的分类的方法会放在方法列表前面,访问的时候就会先被访问到)
    扩展(Extension)

    Extension:扩展, 匿名分类;放在.m文件中
    声明私有属性; (不对子类暴露)
    声明私有方法;
    声明私有成员变量;

    只有.h文件
    UIView+ExtensionView.h
    ProtocolFile.h
    
    协议
    #import <Foundation/Foundation.h>
    
    NS_ASSUME_NONNULL_BEGIN
    
    @protocol ProtocolFile <NSObject>
    
    -(void)ProtocolFile;
    @end
    
    扩展
    #import <UIKit/UIKit.h>
    
    NS_ASSUME_NONNULL_BEGIN
    
    @interface UIView ()
    
    -(void)test;
    @property (nonatomic, copy) NSString *colorStr;
    +(void)testAdd;
    
    @end
    
    NS_ASSUME_NONNULL_END
    
    控制器调用
    #import "ViewController.h"
    #import "UIView+ExtensionView.h"
    #import "ProtocolFile.h"
    
    @interface ViewController ()
    
    @property (nonatomic, strong) UIView *stringView;
    @property (nonatomic, weak) id <ProtocolFile>delagte;
    
    @end
    
    @implementation ViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        
        [self.stringView test];
        [UIView testAdd];
        self.stringView.colorStr = @"hah";
        
        [self.delagte ProtocolFile];
       
    }
    

    所以扩展只以声明方式存在,调用是写在.m中的,所以都是私有的。
    平时开发中其实用的最多。写在.m中的方法和属性,只有本类能用

    分类(Category)和扩展(Extension)区别?
    协议 (protocol)

    代理(delegate)要用weak,防止循环引用。
    代理用weak不用assign原因:

    • assign:
      assign 指针赋值,不对引用计数操作,使用之后如果没有置为nil,可能会产生野指针,delegate指向的对象销毁之后,delegate中依然会保存之前对象的地址,delegate就成了野指针。
    • weak:
      eak 指明该对象并不负责保持delegate这个对象,delegate这个对象的销毁是由外部控制的,当delegate指向的对象销毁之后,delegate = nil。

    相关文章

      网友评论

          本文标题:分类和扩展区别

          本文链接:https://www.haomeiwen.com/subject/ududektx.html