02字面量_MemoryManage_驗證泄漏_NSArray_Dictionary_Copy_MutableCopy_NSNumber

大綱

一弦悉、驗證內(nèi)存是否泄漏
項目:EasyLife
自己創(chuàng)建的類,也要使用dealloc
在dealloc中使用NSLog(@"%s",func)驗證內(nèi)存是否泄漏
二苔悦、數(shù)組
項目:MemoryManage_Array0331
+號方法和字面量 創(chuàng)建 數(shù)組/字典
局部變量可用寺谤,全局變量不可用榛搔,易自動釋放。
三说贝、字典
項目:MemoryManage_Dictionary0331
字典中的allKeys方法:有返回值议惰,會autorelease,聲明為全局變量不安全乡恕。
若要用全局變量言询,就要自己retain
四、copy
項目:MemoryManage_Copy0331
1.何時使用copy和mutableCopy
①copy:實現(xiàn)了NSCopying協(xié)議的類才能使用
②mutableCopy:實現(xiàn)了NSMutableCopying協(xié)議的類才能使用
1.1 NSString

    @interface NSString : NSObject <NSCopying, NSMutableCopying, NSSecureCoding>

1.2 NSNumber

    @interface NSNumber : NSValue
    @interface NSValue : NSObject <NSCopying, NSSecureCoding>

2.返回值
2.1 copy return不可變對象
2.2 mutableCopy return可變對象

3.深淺拷貝
深拷貝:對象拷貝傲宜。新對象运杭,值相同,內(nèi)存地址不同函卒。
淺拷貝:指針拷貝辆憔。新指針,指向原來的對象报嵌。
3.1 不可變對象
copy:淺拷貝
mutableCopy:深拷貝
3.2 可變對象
copy和mutableCopy:深拷貝

4.自定義類虱咧,深、淺拷貝取決于锚国,對協(xié)議方法的實現(xiàn)
5.NSArray

    NSArray *arr = [[NSArray alloc]initWithObjects:@"1",@"2", nil];
    //淺拷貝
    NSArray *arr1 = [arr copy];
    //深拷貝腕巡,但arr內(nèi)的對象(@"1",@"2")只是淺拷貝
    NSArray *arr2 = [arr mutableCopy];

6.聲明NSString類型的屬性時,為什么要用copy
6.1 使用retain
用NSMutableString對象 賦值給 屬性時血筑,只是retainCount+1(兩個指針指向同一個對象)
屬性的值會隨NSMutableString對象值的 改變而改變绘沉。
6.2 使用copy
NSMutableString對象 賦值給 屬性時,是深拷貝(新的對象豺总,內(nèi)存地址不同梆砸,值和原來的對象一樣)
NSMutableString對象 屬性的值 相互獨立

正文

一、驗證內(nèi)存是否泄漏
項目:EasyLife
自己創(chuàng)建的類中也要使用dealloc
在dealloc中使用NSLog(@"%s",func);驗證內(nèi)存是否泄漏
二园欣、數(shù)組
項目:MemoryManage_Array0331
+號方法和字面量 創(chuàng)建 數(shù)組/字典
局部變量可用帖世,全局變量不可用,容易自動釋放沸枯。
源碼:

    //+號方法和字面量 創(chuàng)建數(shù)組/字典
    //1.+號方法
 //局部變量可用日矫,全局變量不可用,容易自動釋放绑榴。
    NSArray *arr = [NSArray arrayWithObjects:@"1", nil];
    NSLog(@"----%d",arr.retainCount);
    //2.字面量方法
    //會自動釋放
    NSArray *arr2 = @[@"1",@"2"];
    NSDictionary *dict1 = @{@"1":@"鍵1",@"2":@"鍵2"};
    //2.1 以下數(shù)組可使用字面量方法:heNanArr,shanDongArr,shanXiArr,anHuiArr
 //因為_totalArr是alloc出來的哪轿,使用中,不用擔(dān)心被自動釋放
    NSArray *heNanArr = [[NSArray alloc]initWithObjects:@"鄭州",@"平頂山",@"南陽", nil];
    NSArray *shanDongArr = [[NSArray alloc]initWithObjects:@"濟南",@"日照",@"菏澤",@"煙臺", nil];
    _totalArr = [[NSArray alloc]initWithObjects:heNanArr,shanDongArr, nil];
 //2.2 字面量方法相當(dāng)于以下“+”號方法翔怎,
 //容易autorelease
 + (NSArray *)createArray
 {
     NSArray *array = [[NSArray alloc]init];
     [array autorelease];
     return array;
 }

三窃诉、字典
項目:MemoryManage_Dictionary0331
字典中的allKeys方法:有返回值杨耙,會autorelease,聲明為全局變量不安全飘痛。
若要用全局變量珊膜,就要自己retain

文件:ViewController.m

NSArray *keyArr = [_provinceDic allKeys];*******************************聲明為全局變量
allKeys方法:有返回值,所以它會autorelease宣脉,不能聲明為全局變量******************
keyArr = [_provinceDic allKeys];
若要用全局變量车柠,就要自己retain
[keyArr retain];

四、copy
項目:MemoryManage_Copy0331
1.何時使用copy和mutableCopy
①copy:實現(xiàn)了NSCopying協(xié)議的類才能使用
②mutableCopy:實現(xiàn)了NSMutableCopying協(xié)議的類才能使用
1.1 NSString

    @interface NSString : NSObject <NSCopying, NSMutableCopying, NSSecureCoding>

1.2 NSNumber

    @interface NSNumber : NSValue
    @interface NSValue : NSObject <NSCopying, NSSecureCoding>

2.返回值
2.1 copy塑猖,返回不可變對象
2.2 mutableCopy返回可變對象

3.深淺拷貝
深拷貝:對象拷貝竹祷。新對象,值相同羊苟,內(nèi)存地址不同塑陵。
淺拷貝:指針拷貝。新指針蜡励,指向原來的對象猿妈。
3.1 不可變對象
copy:淺拷貝
mutableCopy:深拷貝
3.2 可變對象
copy和mutableCopy:都是深拷貝

4.對于自定義類來說,深拷貝和淺拷貝取決于巍虫,對協(xié)議方法的實現(xiàn)
5.NSArray

    NSArray *arr = [[NSArray alloc]initWithObjects:@"1",@"2", nil];
    //淺拷貝
    NSArray *arr1 = [arr copy];
    //深拷貝彭则,但arr內(nèi)的對象(@"1",@"2")只是淺拷貝
    NSArray *arr2 = [arr mutableCopy];

6.聲明屬性,NSString為什么要用copy
6.1 使用retain
NSMutableString對象賦值給NSString屬性時占遥,只是retainCount+1(兩個指針指向同一個對象)
NSString屬性的值會隨NSMutableString對象值的改變而改變俯抖。
6.2 使用copy
NSMutableString對象賦值給NSString屬性時,是深拷貝(新的對象瓦胎,值和原來的對象一樣)
NSMutableString對象 NSString屬性 的值 相互獨立
源碼:
文件:People.m

- (id)copyWithZone:(NSZone *)zone
{
    People *people = [[People alloc]init];
    return people;
}

- (id)mutableCopyWithZone:(NSZone *)zone
{
    return self;
}

文件:ViewController.m

@interface ViewController ()
@property (nonatomic,retain)NSString *string;
@property (nonatomic,copy)NSString *string1;
@end

@implementation ViewController
- (void)dealloc
{
    [_string release];
    [_string1 release];
    [super dealloc];
}
- (void)viewDidLoad
{
    [super viewDidLoad];
    //1.何時使用copy和mutableCopy
    //①copy:實現(xiàn)了NSSCoping協(xié)議的類才能使用
    //②mutableCopy:實現(xiàn)了NSMutableCoping協(xié)議的類才能使用
    
    //NSString
//    @interface NSString : NSObject <NSCopying, NSMutableCopying, NSSecureCoding>
    NSString *text = @"aaa";
    [text copy];
    [text mutableCopy];
    
    //2.返回值
    NSString *text = @"aaa";
    //2.1 使用copy 返回 不可變對象
    NSMutableString *text1 = [text copy];
    //2.2 使用mutableCopy 返回可變對象
    NSMutableString *text2 = [text mutableCopy];
    
    //3.深淺拷貝
    //深拷貝:對象拷貝芬萍。新對象,值相同搔啊,內(nèi)存地址不同柬祠。
    //淺拷貝:指針拷貝。新指針负芋,指向原來的對象漫蛔。
    //3.1 不可變對象
    //copy:淺拷貝
    //mutableCopy:深拷貝
    NSLog(@"%p------%p------%p",text,text1,text2);//內(nèi)存地址:text == text1 != text2
    //3.2 可變對象
    //copy和mutableCopy:都是深拷貝
    NSLog(@"%p======%p======%p",mText,mText1,mText2);//內(nèi)存地址:均不相等
    
    //4.對于自定義類來說,深拷貝和淺拷貝取決于旧蛾,對協(xié)議方法的實現(xiàn)
    //在People中莽龟,我們將協(xié)議方法分別實現(xiàn)如下改變
    //copy:深。 mutableCopy:淺锨天。
    People *p1 = [[People alloc]init];
    People *p2 = [p1 copy];//深拷貝
    People *p3 = [p1 mutableCopy];//淺拷貝
    NSLog(@"%p======%p======%p",p1,p2,p3);//內(nèi)存地址:p1 == p3 != p2
    
    //5.NSArray
    NSArray *arr = [[NSArray alloc]initWithObjects:@"1",@"2", nil];
    //淺拷貝
    NSArray *arr1 = [arr copy];
    //深拷貝毯盈,但arr內(nèi)的對象(@"1",@"2")只是淺拷貝
    NSArray *arr2 = [arr mutableCopy];
    
    //6.聲明屬性,NSString為什么要用copy
    //對象有一個特性:子類對象可以賦給父類的指針病袄。
    NSMutableString *mString = [[NSMutableString alloc]initWithString:@"mmm"];
    //使用retain
    //NSMutableString對象賦值給NSString屬性時搂赋,只是retainCount+1(兩個指針指向同一個對象)
    //NSString屬性的值會隨NSMutableString對象值的改變而改變赘阀。
    self.string = mString;
    //使用copy
    //NSMutableString對象賦值給NSString屬性時,是深拷貝(新的對象脑奠,值和原來的對象一樣)
    //NSMutableString對象 NSString屬性 的值 相互獨立
    self.string1 = mString;
    [mString appendString:@"111"];
    NSLog(@"mString = %@,_string = %@",mString,self.string);
}

//retain
- (void)setString:(NSString *)string
{
    if (_string != string)
    {
        [_string release];
        _string = [string retain];//僅僅是retainCount+1
    }
}

//copy
- (void)setString1:(NSString *)string1
{
    if (_string1 != string1)
    {
        [_string1 release];
        _string1 = [string1 copy];//可變對象調(diào)用copy基公,是深拷貝
    }
}
@end
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市捺信,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌欠痴,老刑警劉巖迄靠,帶你破解...
    沈念sama閱讀 212,454評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異喇辽,居然都是意外死亡掌挚,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評論 3 385
  • 文/潘曉璐 我一進(jìn)店門菩咨,熙熙樓的掌柜王于貴愁眉苦臉地迎上來吠式,“玉大人,你說我怎么就攤上這事抽米√卣迹” “怎么了?”我有些...
    開封第一講書人閱讀 157,921評論 0 348
  • 文/不壞的土叔 我叫張陵云茸,是天一觀的道長是目。 經(jīng)常有香客問我,道長标捺,這世上最難降的妖魔是什么懊纳? 我笑而不...
    開封第一講書人閱讀 56,648評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮亡容,結(jié)果婚禮上嗤疯,老公的妹妹穿的比我還像新娘。我一直安慰自己闺兢,他們只是感情好茂缚,可當(dāng)我...
    茶點故事閱讀 65,770評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著屋谭,像睡著了一般阱佛。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上戴而,一...
    開封第一講書人閱讀 49,950評論 1 291
  • 那天凑术,我揣著相機與錄音,去河邊找鬼所意。 笑死淮逊,一個胖子當(dāng)著我的面吹牛催首,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播泄鹏,決...
    沈念sama閱讀 39,090評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼郎任,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了备籽?” 一聲冷哼從身側(cè)響起舶治,我...
    開封第一講書人閱讀 37,817評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎车猬,沒想到半個月后霉猛,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,275評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡珠闰,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,592評論 2 327
  • 正文 我和宋清朗相戀三年惜浅,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片伏嗜。...
    茶點故事閱讀 38,724評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡坛悉,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出承绸,到底是詐尸還是另有隱情裸影,我是刑警寧澤,帶...
    沈念sama閱讀 34,409評論 4 333
  • 正文 年R本政府宣布军熏,位于F島的核電站空民,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏羞迷。R本人自食惡果不足惜扫俺,卻給世界環(huán)境...
    茶點故事閱讀 40,052評論 3 316
  • 文/蒙蒙 一悉抵、第九天 我趴在偏房一處隱蔽的房頂上張望辛块。 院中可真熱鬧贼邓,春花似錦、人聲如沸热鞍。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,815評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽薇宠。三九已至偷办,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間澄港,已是汗流浹背椒涯。 一陣腳步聲響...
    開封第一講書人閱讀 32,043評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留回梧,地道東北人废岂。 一個月前我還...
    沈念sama閱讀 46,503評論 2 361
  • 正文 我出身青樓祖搓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親湖苞。 傳聞我的和親對象是個殘疾皇子拯欧,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,627評論 2 350

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