iOS开发技巧之:Category中使用属性的懒加载2

1>.methods1

直接在category的.h中添加,这时xcode会有warning。

Property 'test1' requires method 'test1' to be defined - use @dynamic or provide a method implementation in this category

按照提示在.m文件在@dynamic关键字修改就OK了。dynamic在编译时不会检查setter/getter的实现,在运行时setter/getter会动态绑定,在需要setter/getter的class中自己实现就OK了。

 #import <Foundation/Foundation.h>

@interface NSObject (AddProperty1)

@property(nonatomic,strong)NSString *test1;

@end

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

#import "NSObject+AddProperty1.h"

@implementation NSObject (AddProperty1)

@dynamic test1;

@end

(在用这种方法添加proprety,使用setter/getter的class如果不implementation会crash的)

2>.methods2

//只用在.h文件添加协议
#import <Foundation/Foundation.h>

@protocol NSObjectProtocol <NSObject>

@optional

@property(nonatomic,strong)NSString *test3;

@end

@interface NSObject (AddProperty3)<NSObjectProtocol>

@end

同上一种方法一样,在使用setter/getter的class中要implementation,否则会crash

3>.methods3

#import <Foundation/Foundation.h>

@interface NSObject (AddProperty2)

@property(nonatomic,strong)NSString *test2;

@end

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

#import "NSObject+AddProperty2.h"

#import <objc/runtime.h>

@implementation NSObject (AddProperty2)


-(NSString*)test2{

    return objc_getAssociatedObject(self, @selector(test2));
}

-(void)setTest2:(NSString *)test2{

    objc_setAssociatedObject(self, @selector(test2), test2, OBJC_ASSOCIATION_RETAIN_NONATOMIC);

}
@end

利用objctive-c的runtime特性。个人更偏好于第三种方法,改动最小,而且在不知道源码的源码的情况下也能add property

附上Demo省得以后自己忘记了

CategoryAndExtension.zip

参考:https://www.cnblogs.com/starer/p/3813674.html


————————————————

希望后人珍惜时间,少走弯路,享受生活。


VKOOY

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • iOS面试题目100道 1.线程和进程的区别。 进程是系统进行资源分配和调度的一个独立单位,线程是进程的一个实体,...
    有度YouDo阅读 30,058评论 8 137
  • 1、截取字符串”20 | http://www.baidu.com”中,”|”字符前面和后面的数据,分别输出它们 ...
    强子ly阅读 8,175评论 8 46
  • 本文内容由https://blog.csdn.net/intheair100/article/details/72...
    龙诺阅读 3,247评论 0 1
  • OC语言基础 1.类与对象 类方法 OC的类方法只有2种:静态方法和实例方法两种 在OC中,只要方法声明在@int...
    奇异果好补阅读 9,794评论 0 11
  • 面向对象的三大特性:封装、继承、多态 OC内存管理 _strong 引用计数器来控制对象的生命周期。 _weak...
    运气不够技术凑阅读 4,827评论 0 10