所有內(nèi)容引用自
《Objective-C 高級編程 iOS與OS X多線程和內(nèi)存管理》
君丁,加入了自己的部分理解岖沛。
本節(jié)小結(jié)钠怯,點小1
跳到底部[1]
第二節(jié)玻驻、alloc/retain/release/dealloc實現(xiàn)
第三節(jié)、autorelease實現(xiàn)
1摊聋、 ARC
Automatic Reference Counting
鸡捐,自動引用計數(shù)。在LLVM
編譯器中設(shè)置ARC
為有效狀態(tài)麻裁,就不再手動添加 retain
或release
箍镜,編譯器會在合適的位置自動加入。
ARC
需要滿足三個條件:
-
Xcode4.2
及以上版本 -
LLVM 3.0
及以上版本 - 選項中設(shè)置
ARC
有效
2煎源、內(nèi)存管理的思考方式
不要只注意在計數(shù)上色迂,理解思考方式即可:
- 自己生成的對象,自己持有
- 非自己生成的對象手销,自己也能持有
- 自己持有的對象歇僧,不再需要時釋放
- 非自己持有的對象,不能釋放
對象操作和OC方法對應(yīng):
對象操作 | OC方法 |
---|---|
生成并持有對象 |
alloc/new/copy/mutableCopy 等 |
持有對象 | retain |
釋放對象 | release |
廢棄對象 | dealloc |
注:
其中Cocoa
框架中Foundation
框架類庫的NSObject
類擔(dān)負(fù)內(nèi)存管理的職責(zé)锋拖。
alloc/retain/release/dealloc
都來自NSObject
自己生成的對象诈悍,自己持有
凡是以下名稱開頭的方法,都是自己生成自己持有:
alloc
new
copy
mutableCopy
copy兽埃、mutableCopy
侥钳,生成并持有對象的副本,一個是不可變對象柄错,一個是可變對象舷夺。
舉個??
以下都是自己生成并持有對象:
allocObj
newObj
copyObj
mutableCopyObj
以下是錯誤的??:
allocate
newer
copying
mutableCopyed
注:
以駝峰命名的開頭才算是有效的
非自己生成的對象,自己也能持有
??
// 生成對象鄙陡,但不持有冕房,后面會講原因
id obj = [NSMutableArray array];
// ARC 自動加上了retain,ARC模式下不要添加
[obj retain];
注:
非自己生成的對象趁矾,可以通過retain
方法來持有。
自己持有的對象给僵,不再需要時釋放
使用release
方法釋放毫捣。
自己持有的對象详拙,有兩種情況,要么自己生成自己持有的蔓同,要么通過retain
持有的饶辙。
著重說下[NSMutableArray array]
,為什么能生成對象斑粱,但不持有弃揽。
舉個??:
- (id)object{
// 自己生成,自己持有
id obj = [[NSObject alloc] init];
// 對象存在则北,但自己不持有對象
[obj autorelease];
return obj;
}
autorelease
使對象在超出指定的生存范圍后矿微,可以自動釋放,即調(diào)用release
方法尚揣。
簡單原理:autorelease
先將對象注冊到autoreleasepool
中涌矢,autoreleasepool
超出作用域后,會把所有注冊在其中的對象都release
釋放快骗。
注:
凡是取得誰都不持有的對象娜庇,都是用autorelease
實現(xiàn)的。如前面的[NSMutableArray array]
非自己持有的對象方篮,不能釋放
注:
非自己持有的對象名秀,不能釋放,會引起崩潰藕溅。
小結(jié)
1泰偿、內(nèi)存管理的思考方式:
- 自己生成的對象,自己持有
- 非自己生成的對象蜈垮,自己也能持有
- 自己持有的對象耗跛,不再需要時釋放
- 非自己持有的對象,不能釋放
2攒发、以alloc/new/copy/mutableCopy
名稱開頭方法會持有對象调塌,必須以駝峰命名。
3惠猿、生成對象羔砾,但不持有,都是autorelease
實現(xiàn)的偶妖。
4姜凄、autorelease
會把對象注冊到自動釋放池中,自動釋放池結(jié)束生命周期時趾访,釋放所有對象态秧。
-
??假裝是錨點的腳注 ?