zoukankan      html  css  js  c++  java
  • 研究Extension和Category的一个例子

    Category:

        1. 无法添加实例变量

        2.将类的实现分散到多个不同文件或多个不同框架中。

    Extension:

        1. 可以添加实例变量

    注: 如果Category的头文件中也使用Extension(即将 @interface MyData (XX)改为@interface MyData() ),依然不能使用变量。

    千万不要认为在任何地方使用Extension,编译器都会将变量放进来。

    但是如果MyData.m中,包含以下MyData+XX.h,那就可以运行通过。

    所以什么情况下内存会将变量包含进来呢? 就是:为标准声明(@interface MyData:NSObject)or 能够已经包含进MyData.m的Extension。

    如下代码,外部的Extension的property可以被使用,本质原因就是在MyData.m中已经包含进来了(本质上还是因为已经成为了内部Extension)

    ----------MyData.h----------

    #import <Foundation/Foundation.h>

    @interface MyData : NSObject 

    @end

    ----------MyData.m----------

    #import "MyData.h"

    #import "MyData+XX.h" //这句话是关键,如果没有这句话变量依然无法放到类实例内存中

    @interface MyData ()

    @end

    @implementation MyData

    @end

     

     

    ----------MyData+XX.h----------

    #import <Foundation/Foundation.h>

    #import "MyData.h"

    @interface MyData ()  //如果制定定义为 category,就是标准的category了。

    @property (nonatomic, strong) NSString *strTest3;

    - (void)put2;

    @end

     

     

    ----------MyData+XX.m----------

    #import "MyData.h"

    #import "MyData+XX.h" 

    @implementation MyData (XX)

    - (void)put2{

        self.strTest3 = @"abc";

    }

    @end

    使用runtime机制在category中向原有类中添加变量。 

    ---------------------------------------------------------------

    //NSObject+IndieBandName.h
    @interface NSObject (IndieBandName)
    @property (nonatomic, strong) NSString *indieBandName;
    @end
    

      

    // NSObject+IndieBandName.m    
    #import "NSObject+Extension.h"
    #import <objc/runtime.h>
    static const void *IndieBandNameKey = &IndieBandNameKey;    
    @implementation NSObject (IndieBandName)
    @dynamic indieBandName;
    
    - (NSString *)indieBandName {
        return objc_getAssociatedObject(self, IndieBandNameKey);
        //更精致的写法  objc_getAssociatedObject(self, _cmd);
    }
    
    - (void)setIndieBandName:(NSString *)indieBandName{
        objc_setAssociatedObject(self, IndieBandNameKey, indieBandName, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
        //更精致的写法  objc_setAssociatedObject(self, @selector(indieBandName), indieBandName, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
    }
    
    @end
    

      

  • 相关阅读:
    vim 插件之NERD tree
    vim 插件之supertab
    离开页面时发送请求
    修改属性item1(1变化)
    node+express 中安装nodemon实时更新server.js
    vue封装element中table组件
    mysql常用语句
    mysql新建表
    node+express POST请求
    node+express 发送get请求
  • 原文地址:https://www.cnblogs.com/dongfangchun/p/5620797.html
Copyright © 2011-2022 走看看