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
    

      

  • 相关阅读:
    post请求返回404
    启动网关服务报错 Unable to find GatewayFilterFactory with name RequestRateLimiter
    数据库远程连接linux报错2003 can't connect to MySQL server on ip (0) 防火墙没有开放端口3306
    idea下maven项目打包部署到tomcat服务器
    修改Idea背景色
    20种源代码测试工具
    作为一名测试工程师,需要具备哪些能力
    Android自动化测试工具——monkey简介及入门
    appium关于定位元素
    appium testcase2
  • 原文地址:https://www.cnblogs.com/dongfangchun/p/5620797.html
Copyright © 2011-2022 走看看