當年學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 <XxDelegate> delegate;
),壞處二就是代理方法你必須自己一個一個單詞敲了,xcode不會幫你補全。協議的本質就是方法聲明,你遵守了協議,就相當于聲明了這些方法。(比如自定義對象解檔與歸檔的類你不寫<NSCoding>
不會有任何問題)
暫時就寫到這里,以后回想起其它的自己初學的時候沒理解透徹的小知識點會一點點的補充的。