关于内存管理/set/get方法
?
MRC狀態(tài)下
1 任何繼承NSObject的對象,存放于堆控件中,都需要手動管理內(nèi)存 。
2 基本數(shù)據(jù)類型放到棧中,對象放到堆空間中,內(nèi)存是有系統(tǒng)管理的。(int\float\enum\struct)
上句 Person *p = [[Person alloc] init];
上圖:[p release];
Person 對象引用計(jì)數(shù)器為0,手動釋放內(nèi)存,對象被系統(tǒng)回收。
此時:
僵尸對象:當(dāng)前Person對象成為僵尸對象(對象的內(nèi)存空間被系統(tǒng)回收,且無法再繼續(xù)使用)
野指針:指針p被成為野指針(指向僵尸對象的指針) 給野指針發(fā)送消息 會 報(bào)錯
當(dāng) p = nil; p =0; p = NULL;
空指針 此時的p 為空指針(沒指向任何東西的指針) 給空指針發(fā)送消息 不會 報(bào)錯
檢測僵尸對象(?僵尸對象檢測 stop右-》Edit Scheme-》Diagncatics-》 Objective-C-》勾選Enable zomble objects)
?Set方法的內(nèi)存管理
?set方法的內(nèi)存管理分為兩塊
1 set方法中的 release舊值 retain新值
2 dealloc 的release 新值(呼應(yīng)set方法中的retain新值)。
?
?
@property
在MRC狀態(tài)下
1:例如 @property Book *book;
意義:實(shí)現(xiàn)了book的get set方法,生成了_book 且(set方法中無release舊值及retain新值操作僅僅是簡單的賦值)
?
2:例如 @property(assign) int age;
意義:實(shí)現(xiàn)了book的get set方法,生成了_book 且(set方法中無release舊值及retain新值操作僅僅是簡單的賦值),其實(shí)不寫assign也可以,即為直接賦值。
3:例如 @property(retain) Book *book;
意義:實(shí)現(xiàn)了book的get set方法,生成了_book 且(set方法中生成了release舊值及retain新值操作,內(nèi)存管理代碼生成)但是dealloc中的新值release仍需手動釋放。
?
4:例如 @property(copy) Book *book;
意義:實(shí)現(xiàn)了book的get set方法,生成了_book 且(set方法中生成了release舊值及retain新值操作,內(nèi)存管理代碼生成)但是dealloc中的新值release仍需手動釋放 雷同retain
5:例如 @property(readonly/readwrite)Book *book;
意義:前者 生成book的get方法 生成_book, 后者實(shí)現(xiàn)了book的get set方法,生成了_book
6:蛋疼的改名 給變set、get方法名
//重命名 set方法setTest方法名更改為setAbc get方法test更改為bcd 僅僅是改名字 生成的_test變量不變 @property (nonatomic, assign,setter= setAbc:,getter = bcd) int test;-------M -------- //1 如果同時重寫了 set get方法則_test變量消失。。。已測試 //1 如果直重寫了 set get方法其中之一 _test不變 -(void)setAbc:(int)test {_test = test;} //- (int)bcd //{ // return _test; //}?
PS:所以MRC中,property需要配合dealloc使用
?
//property 變量 意味著:生成帶下劃線的成員變量,自動生成setter/getter方法.
//Setter方法是直接賦值(無release舊值 retain新值操作)
//getter方法是返回
//如果兩個方法你都手動實(shí)現(xiàn)(重寫set/get),意味著覆蓋原來生成的get/set方法 及下劃線成員變量(已測試)。
//如果只實(shí)現(xiàn)get/set其中的一個方法,剩下的原方法不會被覆蓋還是會生成帶下劃線的成員變量,
?
//@property(retain) Book *book;
參數(shù)retain:意味著 release舊值 retain新值
被retain的對象,一定要在dealloc中release下
?
//@property(assign) int age;
參數(shù)assign:意味著 直接賦值(默認(rèn)就是直接賦值)
?
//@property(copy) Book *book;
參數(shù)copy:意味著 release舊值 retain新值
//@property(readonly/readwrite)
只生成get方法/set方法
PS:所以MRC中,property需要配合dealloc使用
?
?
---------單個對象的內(nèi)存管理---------
每個對象給引用計(jì)數(shù)器分配四個字節(jié)的存儲空間,當(dāng)對象的引用計(jì)數(shù)器為零時,系統(tǒng)自動回收對象
對象 retain 計(jì)數(shù)器加1
對象 alloc retain copy 引用計(jì)數(shù)器加1
?
dealloc 對象被銷毀,系統(tǒng)會自動給對象發(fā)送一條dealloc方法
dealloc里面寫東西一定最后調(diào)用[super dealloc];
ios的main函數(shù)是個死循環(huán)
?
---------多個對象之間的內(nèi)存管理---------
?
oc對象管理內(nèi)存
?
內(nèi)存管理
1 任何繼承NSObject的對象,都需要管理內(nèi)存
2 基本數(shù)據(jù)類型放到棧中,對象放到堆空間中
3 oc對象 nil指針 release 不報(bào)錯
4 僵尸對象檢測 stop右-》Edit Scheme-》Diagncatics-》 Objective-C-》勾選Enable zomble objects
---------單個對象的內(nèi)存管理---------
每個對象給引用計(jì)數(shù)器分配四個字節(jié)的存儲空間,當(dāng)對象的引用計(jì)數(shù)器為零時,系統(tǒng)自動回收對象
對象 retain 計(jì)數(shù)器加1
對象 alloc retain copy 引用計(jì)數(shù)器加1
?
dealloc 對象被銷毀,系統(tǒng)會自動給對象發(fā)送一條dealloc方法
dealloc里面寫東西一定最后調(diào)用[super dealloc];
ios的main函數(shù)是個死循環(huán)
?
---------多個對象之間的內(nèi)存管理---------
?
oc對象管理內(nèi)存
1 Set方法:將傳進(jìn)來的對象,給類的_成員變量,賦值。
2 Get方法:返回_成員變量.
3 關(guān)于set方法的內(nèi)存管理流程(以人書為例):
set方法,將傳進(jìn)來的book給_book賦值,先要對book 做一次retain計(jì)數(shù)器加一
_book=[book retain];
person類被銷毀時,會調(diào)用dealloc方法,所有在這里要對_book最一次release,
4 set方法的標(biāo)準(zhǔn)寫法(非常重要)
- (void)setCar:(Car *)car
{
if (car!=_car) { // 1
[_car release];// 2
_car=[car retain]; // 3
}
}
注釋:set方法,提供方法以便修改一個類下劃線成員變量的值,
1 正常情況下,只修改一次成員變量的值,只寫3即可(將傳入的對象retain下在賦值),
2 如果再次修改成員變量值,則需要對之前傳入的對象做一次release,即當(dāng)前對象_car。
3 為了嚴(yán)謹(jǐn),需加判斷,現(xiàn)在傳入的對象非當(dāng)前對象。
5 - (Car *)car
{
return car;
}
?
6 - (void)dealloc
{
// 1:對當(dāng)前所擁有的所有對象做一次relase方法
[_car release];
[super dealloc];
}
在MRC中 4,5,6是setter getter的標(biāo)準(zhǔn)寫法
// 2:最后調(diào)用
//循環(huán)引用
@class:僅僅告訴編譯器這是一個類.就可以引用一個類
一方包含頭文件 把兩邊頭文件中的#import換成@class即可
實(shí)現(xiàn)文件中#import.
?
//解決循環(huán)引用問題:
兩端 一邊用@property(retain) dealloc繼續(xù)release
一邊用@property(assign) dealloc無需release
//autorelease
//@autoreleasepool
當(dāng)對象 調(diào)用autorelease方法時,系統(tǒng)會將對象放到釋放池中,對對象的計(jì)數(shù)器無任何影響
?
//@autoreleasepool PS:ios5.0之后的
//在ios5.0之前 需要創(chuàng)建一個自動釋放池對象,在銷毀!~
@autoreleasepool
{//開啟釋放池
}
//結(jié)束釋放池(池中所有對象做一次release操作)
自動釋放池是存在系統(tǒng)的棧中的(這和局部變量的棧不是一個),棧的特點(diǎn)是先進(jìn)后出
?
?
自動釋放池是存在系統(tǒng)的棧中的(這和局部變量的棧不是一個),棧的特點(diǎn)是先進(jìn)后出
?
?
參考資料:http://www.cnblogs.com/appzhang/p/3588169.html
http://blog.csdn.net/q199109106q/article/details/8565017
?
?
轉(zhuǎn)載于:https://www.cnblogs.com/ly1973/p/3705731.html
總結(jié)
以上是生活随笔為你收集整理的关于内存管理/set/get方法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Unity3d 去掉exe版本的边框
- 下一篇: MS Chart 学习心得