当年学iOS的时候,有好多的知识点是知其然不知其所以然,随着时间的推移,很多当时不懂或者不是很懂的知识点渐渐想明白了,所以特此记录在此。这也是这篇文章的初衷,如果你看完这篇文章,会对其中几条产生,原来是这样的感叹,那这篇文章我就写的值了。
1.NSUserDefaults
是个单例,它的本质其实是有个plist,你的setvalue forkey
其实就是存入这个plist。这个plist特殊的地方是它的路径是 沙盒/Library/Preferences ,它的名字是 bundleId.plist。
2.plist文件不能存储自定义对象以及NSObject对象及非(NSString,NSNumber,NSData,NSDate,Boolen
)对象的其他NSObject子类对象(如UIView等)的原因是plist文件只支持上述五种对象类型,其它的对象它不知道怎么存进去。
3.接上一条,解档和归档自定义对象的本质是将自定义对象转成NSData,实现NSCoding协议的2个方法其实就是告诉NSCoder按照怎么的方式去存储和读取对象的每个属性,每个属性都解决了,那么这个对象就知道怎么存储和读取了。[NSKeyedArchiver archivedDataWithRootObject:自定义对象]
,这个方法的内部会调用- (void)encodeWithCoder:(NSCoder *)coder
。解档方法同理。
4.当年作为萌新的我,始终想不明白,为啥遵守协议,给代理赋值为self,再实现代理方法,然后就会自动调用代理方法。为啥我明明没看到【self myFunction】这样的 【对象 代理方法】样子的调用,那方法是怎么偷偷跑起来的呢?答案在下面
if ([_delegate respondsToSelector:@selector(myFunction)]) {
[_delegate myFunction];
}
5.其实不遵守代理的话没有什么大不了,坏处一就是系统会给你报警告(因为@property (nonatomic, weak) id
),坏处二就是代理方法你必须自己一个一个单词敲了,xcode不会帮你补全。协议的本质就是方法声明,你遵守了协议,就相当于声明了这些方法。(比如自定义对象解档与归档的类你不写
不会有任何问题)
暂时就写到这里,以后回想起其它的自己初学的时候没理解透彻的小知识点会一点点的补充的。