美文网首页
ios中如何利用Extension对属性关键字进行扩展

ios中如何利用Extension对属性关键字进行扩展

作者: 思源_d049 | 来源:发表于2018-12-16 21:06 被阅读0次
471544959507_.pic.jpg

4年的创业公司的经历,做着发财大梦,今年终于梦碎了,落得一地鸡毛,回归到市场一看,发现自己犯了太多的错误,痛定思痛,决定破釜沉舟,重新做猿,好好打磨一下技术,明年开春再去市场上找高手过过招,看看能不能拿到一个合适的offer。如今赋闲在帝都的出租房,过着077的日子,“吃饭学习吃饭学习锻炼吃饭学习睡觉”的单调生活,今天下午出去放风去,嚼着开封菜,突然有个想法,把这段时间学到的东西总结一下也分享出来,也请各路高手指点一二。
正在看SDWebImage的源码,在SDWebImageManager类中,头文件中定义了一个imageCache属性,为什么在实现文件的匿名Extension中又定义了一遍呢?

@interface SDWebImageManager : NSObject
@property (strong, nonatomic, readonly, nonnull) id<SDImageCache> imageCache;
@end


@interface SDWebImageManager ()
@property (strong, nonatomic, readwrite, nonnull) SDImageCache *imageCache;
@end

因为平时用category比较多,对Extension也没仔细研究过,通过查资料加试验,逐渐领悟到了扩展俩字的含义了,这里是对同一个属性的扩展,头文件中imageCache属性用了readonly,扩展中加了readwrite关键字,这样保证了对外部其他调用者是只读,而在文件内部是可读可写的,可以调用set/get方法。下面开始测试,使用了NSObject (DLIntrospection)的分类,打印类的内部信息。

@interface ExtentionTest : NSObject
@property (nonatomic, strong, readonly) NSMutableArray * arrs;
@property (nonatomic, readonly, copy) NSString * name;
@end

- (void)viewDidLoad {
    [super viewDidLoad];
    ExtentionTest * e = [[ExtentionTest alloc]init];
    NSArray * propertiesArr = [ExtentionTest properties];
    NSArray * methodesArr = [ExtentionTest instanceMethods];
    NSLog(@"properties:%@",propertiesArr);
    NSLog(@"instanceMethods:%@",methodesArr);
}
屏幕快照 2018-12-16 下午8.03.30.png

我们看属性arrs,我们看到properties数组中和我们定义的完全一致,方法列表中Apple给我们生成了arrs的get方法,没有set方法,因为属性是只读的。下面我们在.m文件的扩展中对属性进行扩展,添加readwrite

@interface ExtentionTest()
@property (nonatomic, readwrite)NSMutableArray * arrs;
@end
屏幕快照 2018-12-16 下午8.10.31.png

我们看到现在,arrs的属性只有nonatomic和strong了,因为readwrite是默认的,method_list中有get/set方法。虽然不可以通过点语法调用set方法,但是我们可以通过performSelector调用。

    [e performSelector:@selector(setArrs:) withObject:[NSMutableArray arrayWithObjects:@1,@2, nil]];
屏幕快照 2018-12-16 下午8.28.06.png

网上关于Extension的总结有很多,因此不再粘贴复制了,以上只是自己的一点点总结,第一篇简书,希望各路大神批评指正。

相关文章

网友评论

      本文标题:ios中如何利用Extension对属性关键字进行扩展

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