美文网首页
在分类中定义属性问题的简要分析

在分类中定义属性问题的简要分析

作者: 小苗晓雪 | 来源:发表于2017-04-11 20:14 被阅读28次

我们都知道在分类中不能定义属性 , 分类就是给本类扩充方法用的 , 但是如果非要在分类中定义属性 , 如果什么都不做的话只是"不负责任的"@property一个属性的话那么我们知道这个属性只有setter , getter方法的声明 , 没有setter , getter方法的实现的!
首先我们就要知道这是为什么?!怎么你编译器或者OC语言帮我个忙 , 好人做到底 , 给我设置一下setter , getter方法的实现就不行呢?!
那是因为当我创建一个本类 , 比如NSArray * array = [[NSArray alloc] init] ;在这个时候我很下意识的做了alloc操作!一定要深入理解这个操作啊!!!
亲!!!你已经开辟好一块固定大小的内存给NSArray类的一个名为array的对象啦!!!
所以说你要再想给这个array里添加属性的话 , 你必然不能在他开辟好的这块内存上添加属性了 , 你只能重新开辟一块内存给分类用来放你新增的这些属性~否则array本来拥有的属性不就得搬家了么?!
但是@property方法有一个特点 , 他有一个后备存储的概念在里面!
就是说你通过@property方法创建的对象是自带_成员变量名称的 , 而且自带setter , getter方法的声明实现的!你这些都有也没用!!你得存储起来才能用!!!你得存到内存上!!!所以如果只是上述操作的话就会崩溃!

综上在分类中定义属性只是一个空壳!他没有后备的存储空间用来存储我这个属性

OCCategory分类方法崩溃信息显示如下:

OCCategory分类方法崩溃信息.png

NSArray+ArrayName.h文件

#import <Foundation/Foundation.h>

@interface NSArray (ArrayName)

@property (nonatomic , copy) NSString *name ;

@end

重写setter , getter方法:
找一个全局的地方去存储:
我们在全局创建一个可变字典用来存储这个属性:

请注意我代码中语法糖的应用:

NSArray+ArrayName.m文件

#import "NSArray+ArrayName.h"
//找一个全局的地方去存储这个name属性:
//首先创建一个可变字典
static NSMutableDictionary *kArrayToName ;

@implementation NSArray (ArrayName)

- (void)initArrayToName {
    if (kArrayToName == nil) {
        kArrayToName = [NSMutableDictionary dictionary] ;
    }
}


#pragma mark - 重写getter方法
- (NSString *)name {
    [self initArrayToName] ;
    //取值的时候强制把内存地址改成一个数字 , 并用@()语法糖包装成NSNumber对象:
    return kArrayToName[@((NSInteger)self)] ;
}


#pragma mark - 重写setter方法
- (void)setName:(NSString *)name {
    [self initArrayToName] ;
    kArrayToName[@((NSInteger)self)] = name ;
}

@end

愿编程让这个世界更美好

相关文章

  • 在分类中定义属性问题的简要分析

    我们都知道在分类中不能定义属性 , 分类就是给本类扩充方法用的 , 但是如果非要在分类中定义属性 , 如果什么都不...

  • 自定义Button的样式

    自定义Button的样式和buttonBlock 遇到的问题 一个分类就解决问题,在分类中添加了block属性,用...

  • 02(用户反馈)

    题目:整理百度外卖在“新浪微博”的用户反馈1. 自定义关键字,找到50条反馈2. 对用户反馈进行分类,简要分析问题...

  • iOS - 关联对象Association

    上周写了篇关于iOS 分类的文章,我们可以在分类中定义属性,但只是定义了属性,编译器既没有生成相应的setter和...

  • 看书笔记26-30

    二十六:勿在分类中声明属性 把封装数据所用的全部属性都定义在主接口里。在"class-continuation分类...

  • 定义BookClass

    //定义图书属性类BookClass 属性类中添加:Bookcls(分类)、BookName(书名)、Price...

  • Effective Objective-C读后笔记(3)

    21、分类的属性问题 尽可能少的在分类中使用属性,分类的主要目的是扩展功能; 分类中要使用的数据尽可能的在主类中定...

  • OC分类中增加属性

    原来看别人的文章介绍说分类中无法增加属性,但是看AFN,MJRefresh等开源库,发现很多都在分类中定义了属性,...

  • 07.Objective-C 关联对象

    问题 分类中可以添加属性吗? 整么才能使分类中的属性,像正常类的属性一样使用? 关联对象的本质 答案 分类中可以添...

  • 自定义View的简单流程

    自定义View的步骤 1、自定义属性 1)分析自定义的View中需要哪些的自定义属性,在res/values/at...

网友评论

      本文标题:在分类中定义属性问题的简要分析

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