
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);
}

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

我们看到现在,arrs的属性只有nonatomic和strong了,因为readwrite是默认的,method_list中有get/set方法。虽然不可以通过点语法调用set方法,但是我们可以通过performSelector调用。
[e performSelector:@selector(setArrs:) withObject:[NSMutableArray arrayWithObjects:@1,@2, nil]];

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