• 研究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
    

      

  • 相关阅读:
    android apk瘦身之 图片压缩 tinypng
    java 1.7 新io 实践 NIO2
    Still unable to dial persistent://blog.csdn.net:80 after 3 attempts
    dex2oat 加载多次
    android stadio open recent 在同一窗口打开
    &运算符的应用
    MethodTrace 生成的trace文件为空
    MethodTrace 生成的trace文件为空
    error: unknown host service 的详细解决办法
    error: unknown host service 的详细解决办法
  • 原文地址:https://www.cnblogs.com/dongfangchun/p/5620797.html
Copyright © 2020-2023  润新知