我的iOS学习历程 - OC第九天
生活随笔
收集整理的這篇文章主要介紹了
我的iOS学习历程 - OC第九天
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
今天主要講的是內存的管理方法
1.IOS的內存管理中 Mac是使用的垃圾回收(gc) 有輪詢延遲
? ?手機用的是 引用計數
2.引用計數的方法:
( 1 ) alloc
alloc 開辟空間引用計數 從0 ->1
Person *p1 = [[Person alloc]initWithName:@"wanglong" age:18];retain 使用引用計數 +1
Person *p2 = [p1 retain];( 3 )?retainCount
計數的數字
NSLog(@"%ld",[p3 retainCount]);( 4 ) release
release 影響引用計數 -1,
當對象的引用計數為0 的時候,該對象就會被系統釋放
[p1 release];(5) autorelease
autorelease 在未來的某一時刻引用計數 會自動-1
autorelease ?需要自動釋放池去-1
autorelease ?是要依托自動釋放池去釋放的
出了自動釋放池 相當于系統會給釋放池中間調用了autorelease對象發送一個 release消息
自動釋放池:
@autoreleasepool {[p1 autorelease];// 相當于一個棧 出入池跟出入棧一個道理}for (int i = 0; i < 10; i++) {Person *p = [[Person alloc]initWithName:@"Curry" age:21];@autoreleasepool {// 釋放池加在里面好 如果i< 很大的數就可能內存溢出[p autorelease];}}注意:類方法,便利構造器方法 使用autorelease,其他方法需要再外部釋放,是一個規范( 6 ) copy
實現拷貝協議中的方法,需要滿足NSCoping協議
copy方法對引用計數的影響要看你是怎么想法的,看你怎么實現copyWithZone方法
偽拷貝 拷貝完還是一個對象(直接返回)
- (id)copyWithZone:(NSZone *)zone{// 淺拷貝// 拷貝后 有兩個對象 但是他們的值是同一個值 引用計數變化 被拷貝的對象不變 拷貝出來的新對象從0->1// 深拷貝 拷貝出新對象 并且 對象值也重新拷貝一份再賦值// 對字符串進行拷貝 拷貝的結果 要看字符串這個類如何實現的拷貝方法 對不可變字符串的拷貝 其實相當于 直接retain一次// 可變字符串 拷貝時 就是真拷貝了一個新的出來NSString *str = [_name copy]; Person *p = [[Person alloc ]initWithName:str age:_age];// 這叫做偽拷貝(直接返回)return p;}( 7 ) dealloc
書寫規范 一定要寫在類的最上面,系統自動調用
如果重寫的話:-(void)dealloc {// 如果要寫東西都寫在[super dealloc]上面,防止出現野指針情況// 如果重寫dealloc方法 必須要調用父類的方法// 保證 對象可以被釋放[super dealloc]; }轉載于:https://www.cnblogs.com/888yf/p/4992727.html
總結
以上是生活随笔為你收集整理的我的iOS学习历程 - OC第九天的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Lucene学习笔记(1)
- 下一篇: idea快速导包快捷键