內(nèi)存管理相關(guān)知識(shí)

內(nèi)存分區(qū)情況

棧區(qū) - 由編譯器分配和釋放,存放函數(shù)參數(shù)和局部變量平斩,該區(qū)域是向低地址擴(kuò)展的數(shù)據(jù)結(jié)構(gòu)亚享,是一段連續(xù)的內(nèi)存區(qū)域
堆區(qū) - 由開(kāi)發(fā)者負(fù)責(zé)分配和釋放,該區(qū)域是向高地址擴(kuò)展的數(shù)據(jù)結(jié)構(gòu)绘面,是一段不連續(xù)的內(nèi)存區(qū)域
全局區(qū) - 存放全局變量和靜態(tài)變量的區(qū)域欺税,初始化的全局變量和靜態(tài)變量放在一個(gè)區(qū)域,未初始化的全局變量和靜態(tài)變量放在相鄰的區(qū)域揭璃,程序結(jié)束后由系統(tǒng)釋放
常量區(qū) - 存放常量字符串晚凿,程序結(jié)束后由系統(tǒng)釋放
代碼區(qū) - 存放代碼的二進(jìn)制數(shù)據(jù)的區(qū)域

weak

  • 什么情況下會(huì)只用weak關(guān)鍵字,與assign有什么區(qū)別瘦馍?
    在會(huì)出現(xiàn)循環(huán)引用的情況下會(huì)使用weak歼秽,比如delegate;在使用IBOutlet外鏈對(duì)象時(shí)也會(huì)使用weak情组。
    weak表示一種非擁有關(guān)系燥筷,為這種屬性設(shè)置值時(shí),既不會(huì)保留新值院崇,也不會(huì)釋放舊值肆氓,這一點(diǎn)與assign類(lèi)似,但是在指向?qū)ο蟊讳N(xiāo)毀時(shí)亚脆,屬性值也會(huì)被置空做院,而assign只是簡(jiǎn)單的賦值操作;
    weak只能修飾OC對(duì)象,而assign用于修飾非OC對(duì)象键耕。

  • IBOutlet外鏈對(duì)象可不可以用strong寺滚?
    可以,而且官方還強(qiáng)烈推薦使用strong屈雄,除了一些會(huì)出現(xiàn)循環(huán)引用的情況村视。
    首先看下weak和strong同時(shí)修飾一個(gè)控件時(shí)的持有關(guān)系:
    weak-VC會(huì)持有View,View會(huì)強(qiáng)引用控件酒奶,VC對(duì)控件是弱引用
    strong-VC會(huì)持有View蚁孔,View會(huì)強(qiáng)引用控件,VC對(duì)控件是強(qiáng)引用
    至于早期為什么蘋(píng)果推薦使用weak去修飾惋嚎,這是因?yàn)樵缙趇Phone內(nèi)存比較小杠氢,當(dāng)內(nèi)存過(guò)低時(shí)會(huì)釋放View,而此時(shí)如果使用strong另伍,則控件不會(huì)被釋放鼻百,所以需要我們手動(dòng)去釋放,而使用weak控件會(huì)因?yàn)関iew被釋放而釋放摆尝;但是現(xiàn)在隨著設(shè)備的性能越來(lái)越高温艇,再也不會(huì)出現(xiàn)需要釋放view的情況,這兩這個(gè)修飾符帶來(lái)的結(jié)果也就一樣了堕汞,所以蘋(píng)果現(xiàn)在推薦使用strong來(lái)修飾外鏈對(duì)象

  • weak是如何實(shí)現(xiàn)的勺爱?
    runtime對(duì)注冊(cè)的類(lèi),會(huì)維護(hù)一個(gè)weak表讯检,表中以weak指向?qū)ο蟮膬?nèi)存地址為key琐鲁,對(duì)象為value

  • weak需要在dealloc中置空嗎?
    不需要视哑,當(dāng)此對(duì)象的引用計(jì)數(shù)為0時(shí)绣否,會(huì)自動(dòng)調(diào)用dealloc方法誊涯,接著會(huì)以weak對(duì)象指向的內(nèi)存地址為key在weak表中搜索挡毅,找到所有以這個(gè)內(nèi)存地址為key的對(duì)象并置空

  • weak屬性set方法的大致實(shí)現(xiàn)

- (void)setObject:(id) object {
  objc_setAssociatedObject(self, "object", object, OBJC_ASSOCIATION_ASSIGN);
  [object cyl_runAtDealloc{ object = nil }];
}

copy

  • 如何讓自己的類(lèi)用copy修飾符?
    通過(guò)實(shí)現(xiàn)NSCopying協(xié)議暴构,這個(gè)協(xié)議只有一個(gè)方法copyWithZone跪呈,讓我們自己的類(lèi)具有拷貝功能;如果我們的類(lèi)還分為可變版本取逾,那么就需要再實(shí)現(xiàn)NSMutableCopying協(xié)議耗绿,
  • 如何重寫(xiě)copy關(guān)鍵字的setter方法?
- (void) setObject:(id)object {
  _object = [object copy];
}
  • 淺拷貝和深拷貝
    淺拷貝砾隅,不拷貝對(duì)象本身误阻,僅僅是拷貝指針;
    深拷貝,直接拷貝整個(gè)對(duì)象到另一塊內(nèi)存中究反。
    copy 淺拷貝
NSString *str1 = @"123";
NSString *str2 = [str1 copy];
NSLog(@"str1 p:%p, str2 p:%p", str1, str2);

打印

str1 p:0x10ea830e8, str2 p:0x10ea830e8

通過(guò)打印信息寻定,可以看到str1和str2指向同一塊內(nèi)存,只針對(duì)內(nèi)存地址進(jìn)行了拷貝
那如果此時(shí)我將str1進(jìn)行重新賦值精耐,str2會(huì)發(fā)生變化嗎狼速?

NSString *str1 = @"123";
NSString *str2 = [str1 copy];
str1 = @"abc";
NSLog(@"str p:%p, str2 p:%p", str1, str2);

打印

str p:0x1045a5108, str2 p:0x1045a50e8

通過(guò)打印發(fā)現(xiàn)源對(duì)象指向的內(nèi)存地址發(fā)生了改變,這是為什么呢卦停?
copy擁有自己的特點(diǎn):修改源對(duì)象的屬性不會(huì)影響副本對(duì)象向胡,修改副本對(duì)象的屬性也不會(huì)影響源對(duì)象。
這個(gè)特點(diǎn)是為什么呢惊完,因?yàn)樽铋_(kāi)始str1僵芹、str2指向的同一個(gè)不可變字符串,這個(gè)時(shí)候系統(tǒng)為了優(yōu)化性能小槐,只生成了一個(gè)指針即可淮捆;但是當(dāng)str1值發(fā)生變化時(shí),這個(gè)不可變@"123"本股,是不可能變成@"abc"的攀痊,在互不影響的原則下,系統(tǒng)就重寫(xiě)開(kāi)辟了一塊內(nèi)存空間

copy 一個(gè)可變數(shù)組

NSMutableArray *ary1 = [@[@"a", @"b", @"c"] mutableCopy];
NSMutableArray *ary2 = [ary1 copy];
NSLog(@"\nary1 class:%@ p:%p\nary2 class:%@ p:%p", [ary1 class], ary1, [ary2 class], ary2);

打印

ary1 class:__NSArrayM p:0x60000153f390
ary2 class:__NSArrayI p:0x60000153f450

通過(guò)打印ary2賦值是ary1經(jīng)過(guò)copy的拄显,它的類(lèi)型是不可變數(shù)組苟径,而ary1是可變數(shù)組,ary2的copy是一次深拷貝躬审,指針和內(nèi)容都被拷貝了一份棘街,這個(gè)原因和上面的一樣,都是遵循互不影響原則承边,重新開(kāi)辟了一個(gè)內(nèi)存

copy總結(jié):

  • copy修飾或者賦值的變量肯定是不可變的
  • 用copy賦值的遭殉,要看源對(duì)象是否可變,來(lái)決定是淺拷貝還是深拷貝
  • 使用mutableCopy賦值的博助,肯定是深拷貝
  • 對(duì)象之間賦值之后险污,再改變,遵循互不影響的原則

property的本質(zhì)是什么富岳?ivar蛔糯、setter、getter是如何生成的

property的本質(zhì)就是實(shí)例變量ivar加上存取方法setter/getter窖式。
編譯器在編譯期會(huì)通過(guò)自動(dòng)合成蚁飒,生成訪問(wèn)這些屬性需要的方法,并生成一個(gè)帶_的實(shí)例變量萝喘,也可以通過(guò)synthesize去指定實(shí)例變量的名字

生活如此美好淮逻,今天就點(diǎn)到為止琼懊。。爬早。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末肩碟,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子凸椿,更是在濱河造成了極大的恐慌削祈,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,820評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件脑漫,死亡現(xiàn)場(chǎng)離奇詭異髓抑,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)优幸,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,648評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)吨拍,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人网杆,你說(shuō)我怎么就攤上這事羹饰。” “怎么了碳却?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,324評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵队秩,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我昼浦,道長(zhǎng)馍资,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,714評(píng)論 1 297
  • 正文 為了忘掉前任关噪,我火速辦了婚禮鸟蟹,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘使兔。我一直安慰自己建钥,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,724評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布虐沥。 她就那樣靜靜地躺著熊经,像睡著了一般。 火紅的嫁衣襯著肌膚如雪置蜀。 梳的紋絲不亂的頭發(fā)上奈搜,一...
    開(kāi)封第一講書(shū)人閱讀 52,328評(píng)論 1 310
  • 那天,我揣著相機(jī)與錄音盯荤,去河邊找鬼。 笑死焕盟,一個(gè)胖子當(dāng)著我的面吹牛秋秤,可吹牛的內(nèi)容都是我干的宏粤。 我是一名探鬼主播,決...
    沈念sama閱讀 40,897評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼灼卢,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼绍哎!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起鞋真,我...
    開(kāi)封第一講書(shū)人閱讀 39,804評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤崇堰,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后涩咖,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體海诲,經(jīng)...
    沈念sama閱讀 46,345評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,431評(píng)論 3 340
  • 正文 我和宋清朗相戀三年檩互,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了特幔。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,561評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡闸昨,死狀恐怖蚯斯,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情饵较,我是刑警寧澤拍嵌,帶...
    沈念sama閱讀 36,238評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站循诉,受9級(jí)特大地震影響撰茎,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜打洼,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,928評(píng)論 3 334
  • 文/蒙蒙 一龄糊、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧募疮,春花似錦炫惩、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,417評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至芭毙,卻和暖如春筋蓖,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背退敦。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,528評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工粘咖, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人侈百。 一個(gè)月前我還...
    沈念sama閱讀 48,983評(píng)論 3 376
  • 正文 我出身青樓瓮下,卻偏偏與公主長(zhǎng)得像翰铡,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子讽坏,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,573評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容

  • 面向?qū)ο蟮娜筇卣?并作簡(jiǎn)單的介紹锭魔。 面向?qū)ο蟮娜齻€(gè)基本特征是:封裝、繼承路呜、多態(tài)迷捧。 1.封裝是面向?qū)ο蟮奶卣髦?...
    xiny123閱讀 1,435評(píng)論 0 6
  • 設(shè)計(jì)模式是什么? 你知道哪些設(shè)計(jì)模式胀葱,并簡(jiǎn)要敘述漠秋? 設(shè)計(jì)模式是一種編碼經(jīng)驗(yàn),就是用比較成熟的邏輯去處理某一種類(lèi)型的...
    iOS菜鳥(niǎo)大大閱讀 709評(píng)論 0 1
  • 一巡社、深復(fù)制和淺復(fù)制的區(qū)別膛堤? 1、淺復(fù)制:只是復(fù)制了指向?qū)ο蟮闹羔樕胃茫磧蓚€(gè)指針指向同一塊內(nèi)存單元肥荔!而不復(fù)制指向?qū)ο蟮?..
    iOS_Alex閱讀 1,389評(píng)論 1 27
  • ———————————————回答好下面的足夠了---------------------------------...
    恒愛(ài)DE問(wèn)候閱讀 1,720評(píng)論 0 4
  • 把網(wǎng)上的一些結(jié)合自己面試時(shí)遇到的面試題總結(jié)了一下,以后有新的還會(huì)再加進(jìn)來(lái)朝群。 1. OC 的理解與特性 OC 作為一...
    AlaricMurray閱讀 2,569評(píng)論 0 20