Objective-C 內(nèi)存管理(初級)

import <Foundation/Foundation.h>

import "Person.h"

int main(int argc, const char * argv[]) {

Person *per = [[Person alloc] init];
per.name = @"xiaolaohu";
NSLog(@"retainCount: %lu", per.retainCount);
[per retain];

NSLog(@"retainCount: %lu", per.retainCount);
[per retain];

NSLog(@"retainCount: %lu", per.retainCount);

Person *per1 = per;
NSLog(@"retainCount: %lu", per1.retainCount);
[per release];

NSLog(@"retainCount: %lu", per1.retainCount);
[per release];

NSLog(@"retainCount: %lu", per1.retainCount);

// 當引用計數(shù)為1時, 在release系統(tǒng)會認為此事應該銷毀對象, 所以引用計數(shù)從1到0的減法運算實際并沒有做
[per release];

NSLog(@"retainCount: %lu", per1.retainCount);

// // 當對象銷毀時再次發(fā)送release消息, 就會發(fā)生內(nèi)存過度釋放
// [per release];

// 有時候crash, 有時候不crash, 因為我們最后一次release相當于告訴系統(tǒng)這塊內(nèi)存不再使用, 可以重新分配, 如果此內(nèi)存被重新分配, 就會crash, 沒有分配就不會crash

// NSLog(@"name: %@", per.name);

// 安全釋放: 為了防止野指針, 我們使用完之后給指針置為nil
per = nil;
[per sayHi];

/**
 * 內(nèi)存管理原則
 * 1. 凡是使了alloc、retain 或者copy讓內(nèi)存的引用計數(shù)增加了,就需要使release或  者autorelease讓內(nèi)存的引用計數(shù)減少势似。在一段代碼內(nèi),增加和減少的次數(shù)要相等叙甸。
 * 2. 如果增加的次數(shù)大于減少的次數(shù),會造成內(nèi)存泄露葬毫。
 * 3. 如果增加次數(shù)小于減少的次數(shù),會造成過度釋放匾嘱。
 * 4. 如果增加的次數(shù)等于減少的次數(shù),還繼續(xù)訪問,造成野指針問題氮趋。
 */

Person *p3 = [[Person alloc] init];
[p3 retain];
[p3 retain];
NSLog(@"p3: %lu", p3.retainCount);

@autoreleasepool {
    NSLog(@"p3: %lu", p3.retainCount);
}

// 把一個對象添加到一個集合中會對該對象的引用計數(shù)加1, 如果移除會對該對象的引用計數(shù)減1
Person *p4 = [[Person alloc] init];
NSMutableArray *arr = [NSMutableArray array];
[arr addObject:p4];
[p4 release];

// 字符串直接賦值實質(zhì)上是賦了一個常量字符串, 不要嘗試release一個常量, 因為沒有用
NSString *str = @"wsz"; // -1
[str release];
[str release];
NSLog(@"str: %ld", str.retainCount);

NSString *str0 = @"嘿嘿嘿"; // -1
NSLog(@"str0: %ld", str0.retainCount);
NSString *str1 = [[NSString alloc] init]; // -1
NSLog(@"str1: %ld", str1.retainCount);
NSString *str2 = [NSString string]; // -1
NSLog(@"str2: %ld", str2.retainCount);
NSString *str3 = [[NSString alloc] initWithFormat:@"aaa"]; // -1
NSLog(@"str3: %ld", str3.retainCount);
NSString *str4 = [[NSString alloc] initWithFormat:@"哈哈哈"]; // 1
NSLog(@"str4: %ld", str4.retainCount);   
NSString *str5 = [NSString stringWithFormat:@"wer"]; // -1
NSLog(@"str5: %ld", str5.retainCount);    
NSString *str6 = [NSString stringWithFormat:@"啊啊啊"]; // 1
NSLog(@"str6: %ld", str6.retainCount);

Person *p5 = [[Person alloc] init];
p5.name = @"king old luck";
Person *p6 = [p5 copy];
NSLog(@"p5: %p, p6: %p", p5, p6);

// 不可變字符串調(diào)用copy方法, 是淺拷貝, 拷貝的是指針
// 不可變字符串調(diào)用mutableCopy方法, 是深拷貝, 拷貝的是內(nèi)容, 拷貝后得到的副本為可變字符串
NSString *string = @"tyu";
NSMutableString *mutableString = [string mutableCopy];
[mutableString appendString:@"aaa"];
NSLog(@"mutable: %@", mutableString);

// 可變字符串使用copy方法是深拷貝, 得到的是不可變副本
// 可變字符串使用mutableCopy是深拷貝, 得到的是可變副本
NSMutableString *mStr = [NSMutableString stringWithFormat:@"aaaa"];
NSString *mStr1 = [mStr copy];
NSLog(@"mutable: %@", mStr1);

return 0;

}

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末接剩,一起剝皮案震驚了整個濱河市皆警,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌粱甫,老刑警劉巖泳叠,帶你破解...
    沈念sama閱讀 217,509評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異茶宵,居然都是意外死亡危纫,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評論 3 394
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來种蝶,“玉大人契耿,你說我怎么就攤上這事◇φ鳎” “怎么了搪桂?”我有些...
    開封第一講書人閱讀 163,875評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長盯滚。 經(jīng)常有香客問我踢械,道長,這世上最難降的妖魔是什么魄藕? 我笑而不...
    開封第一講書人閱讀 58,441評論 1 293
  • 正文 為了忘掉前任内列,我火速辦了婚禮,結果婚禮上背率,老公的妹妹穿的比我還像新娘话瞧。我一直安慰自己,他們只是感情好寝姿,可當我...
    茶點故事閱讀 67,488評論 6 392
  • 文/花漫 我一把揭開白布交排。 她就那樣靜靜地躺著,像睡著了一般饵筑。 火紅的嫁衣襯著肌膚如雪埃篓。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,365評論 1 302
  • 那天根资,我揣著相機與錄音市咆,去河邊找鬼桐臊。 笑死况毅,一個胖子當著我的面吹牛导犹,可吹牛的內(nèi)容都是我干的塞椎。 我是一名探鬼主播桨仿,決...
    沈念sama閱讀 40,190評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼案狠!你這毒婦竟也來了服傍?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,062評論 0 276
  • 序言:老撾萬榮一對情侶失蹤骂铁,失蹤者是張志新(化名)和其女友劉穎吹零,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體拉庵,經(jīng)...
    沈念sama閱讀 45,500評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡灿椅,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,706評論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片茫蛹。...
    茶點故事閱讀 39,834評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡操刀,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出婴洼,到底是詐尸還是另有隱情骨坑,我是刑警寧澤,帶...
    沈念sama閱讀 35,559評論 5 345
  • 正文 年R本政府宣布柬采,位于F島的核電站欢唾,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏粉捻。R本人自食惡果不足惜礁遣,卻給世界環(huán)境...
    茶點故事閱讀 41,167評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望杀迹。 院中可真熱鬧亡脸,春花似錦、人聲如沸树酪。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽续语。三九已至垂谢,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間疮茄,已是汗流浹背滥朱。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留力试,地道東北人徙邻。 一個月前我還...
    沈念sama閱讀 47,958評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像畸裳,于是被迫代替她去往敵國和親缰犁。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,779評論 2 354

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