日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

关于内存管理/set/get方法

發布時間:2025/3/21 编程问答 15 豆豆
生活随笔 收集整理的這篇文章主要介紹了 关于内存管理/set/get方法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

?

MRC狀態下

1 任何繼承NSObject的對象,存放于堆控件中,都需要手動管理內存 。
2 基本數據類型放到棧中,對象放到堆空間中,內存是有系統管理的。(int\float\enum\struct)

上句 Person *p = [[Person alloc] init];

上圖:[p release];

Person 對象引用計數器為0,手動釋放內存,對象被系統回收。

此時:

僵尸對象:當前Person對象成為僵尸對象(對象的內存空間被系統回收,且無法再繼續使用)

野指針:指針p被成為野指針(指向僵尸對象的指針) 給野指針發送消息 會 報錯

當 p = nil; p =0; p = NULL;

空指針 此時的p 為空指針(沒指向任何東西的指針) 給空指針發送消息 不會 報錯

檢測僵尸對象(?僵尸對象檢測 stop右-》Edit Scheme-》Diagncatics-》 Objective-C-》勾選Enable zomble objects)



?Set方法的內存管理

?set方法的內存管理分為兩塊

1 set方法中的 release舊值 retain新值

2 dealloc 的release 新值(呼應set方法中的retain新值)。

?

?

@property

在MRC狀態下

1:例如 @property Book *book;

意義:實現了book的get set方法,生成了_book 且(set方法中無release舊值及retain新值操作僅僅是簡單的賦值)

?

2:例如 @property(assign) int age;

意義:實現了book的get set方法,生成了_book 且(set方法中無release舊值及retain新值操作僅僅是簡單的賦值),其實不寫assign也可以,即為直接賦值。

3:例如 @property(retain) Book *book;

意義:實現了book的get set方法,生成了_book 且(set方法中生成了release舊值及retain新值操作,內存管理代碼生成)但是dealloc中的新值release仍需手動釋放。

?

4:例如 @property(copy) Book *book;
意義:實現了book的get set方法,生成了_book 且(set方法中生成了release舊值及retain新值操作,內存管理代碼生成)但是dealloc中的新值release仍需手動釋放 雷同retain

5:例如 @property(readonly/readwrite)Book *book;
意義:前者 生成book的get方法 生成_book, 后者實現了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方法是返回


//如果兩個方法你都手動實現(重寫set/get),意味著覆蓋原來生成的get/set方法 及下劃線成員變量(已測試)。


//如果只實現get/set其中的一個方法,剩下的原方法不會被覆蓋還是會生成帶下劃線的成員變量,

?


//@property(retain) Book *book;

參數retain:意味著 release舊值 retain新值
被retain的對象,一定要在dealloc中release下

?

//@property(assign) int age;
參數assign:意味著 直接賦值(默認就是直接賦值)

?

//@property(copy) Book *book;
參數copy:意味著 release舊值 retain新值


//@property(readonly/readwrite)
只生成get方法/set方法

PS:所以MRC中,property需要配合dealloc使用

?

?

---------單個對象的內存管理---------

每個對象給引用計數器分配四個字節的存儲空間,當對象的引用計數器為零時,系統自動回收對象
對象 retain 計數器加1


對象 alloc retain copy 引用計數器加1

?

dealloc 對象被銷毀,系統會自動給對象發送一條dealloc方法
dealloc里面寫東西一定最后調用[super dealloc];

ios的main函數是個死循環

?

---------多個對象之間的內存管理---------

?

oc對象管理內存

?

內存管理

1 任何繼承NSObject的對象,都需要管理內存
2 基本數據類型放到棧中,對象放到堆空間中
3 oc對象 nil指針 release 不報錯
4 僵尸對象檢測 stop右-》Edit Scheme-》Diagncatics-》 Objective-C-》勾選Enable zomble objects

---------單個對象的內存管理---------

每個對象給引用計數器分配四個字節的存儲空間,當對象的引用計數器為零時,系統自動回收對象
對象 retain 計數器加1


對象 alloc retain copy 引用計數器加1

?

dealloc 對象被銷毀,系統會自動給對象發送一條dealloc方法
dealloc里面寫東西一定最后調用[super dealloc];

ios的main函數是個死循環

?

---------多個對象之間的內存管理---------

?

oc對象管理內存


1 Set方法:將傳進來的對象,給類的_成員變量,賦值。
2 Get方法:返回_成員變量.

3 關于set方法的內存管理流程(以人書為例):
set方法,將傳進來的book給_book賦值,先要對book 做一次retain計數器加一
_book=[book retain];

person類被銷毀時,會調用dealloc方法,所有在這里要對_book最一次release,

4 set方法的標準寫法(非常重要)

- (void)setCar:(Car *)car

{

if (car!=_car) { // 1
[_car release];// 2
_car=[car retain]; // 3

}
}
注釋:set方法,提供方法以便修改一個類下劃線成員變量的值,
1 正常情況下,只修改一次成員變量的值,只寫3即可(將傳入的對象retain下在賦值),
2 如果再次修改成員變量值,則需要對之前傳入的對象做一次release,即當前對象_car。
3 為了嚴謹,需加判斷,現在傳入的對象非當前對象。

5 - (Car *)car

{

return car;

}

?

6 - (void)dealloc
{

// 1:對當前所擁有的所有對象做一次relase方法

[_car release];

[super dealloc];
}

在MRC中 4,5,6是setter getter的標準寫法
// 2:最后調用



//循環引用
@class:僅僅告訴編譯器這是一個類.就可以引用一個類
一方包含頭文件 把兩邊頭文件中的#import換成@class即可
實現文件中#import.

?

//解決循環引用問題:
兩端 一邊用@property(retain) dealloc繼續release
一邊用@property(assign) dealloc無需release


//autorelease
//@autoreleasepool

當對象 調用autorelease方法時,系統會將對象放到釋放池中,對對象的計數器無任何影響

?

//@autoreleasepool PS:ios5.0之后的

//在ios5.0之前 需要創建一個自動釋放池對象,在銷毀!~
@autoreleasepool
{//開啟釋放池

}
//結束釋放池(池中所有對象做一次release操作)

自動釋放池是存在系統的棧中的(這和局部變量的棧不是一個),棧的特點是先進后出

?

?

自動釋放池是存在系統的棧中的(這和局部變量的棧不是一個),棧的特點是先進后出

?

?

參考資料:http://www.cnblogs.com/appzhang/p/3588169.html

http://blog.csdn.net/q199109106q/article/details/8565017

?

?

轉載于:https://www.cnblogs.com/ly1973/p/3705731.html

總結

以上是生活随笔為你收集整理的关于内存管理/set/get方法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。