02字面量_MemoryManage_验证泄漏_NSArray_Dictionary_Copy_MutableCopy_NSNumber

大纲

一、验证内存是否泄漏
项目:EasyLife
自己创建的类,也要使用dealloc
在dealloc中使用NSLog(@"%s",func)验证内存是否泄漏
二、数组
项目:MemoryManage_Array0331
+号方法和字面量 创建 数组/字典
局部变量可用,全局变量不可用,易自动释放。
三、字典
项目:MemoryManage_Dictionary0331
字典中的allKeys方法:有返回值,会autorelease,声明为全局变量不安全。
若要用全局变量,就要自己retain
四、copy
项目:MemoryManage_Copy0331
1.何时使用copy和mutableCopy
①copy:实现了NSCopying协议的类才能使用
②mutableCopy:实现了NSMutableCopying协议的类才能使用
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.深浅拷贝
深拷贝:对象拷贝。新对象,值相同,内存地址不同。
浅拷贝:指针拷贝。新指针,指向原来的对象。
3.1 不可变对象
copy:浅拷贝
mutableCopy:深拷贝
3.2 可变对象
copy和mutableCopy:深拷贝

4.自定义类,深、浅拷贝取决于,对协议方法的实现
5.NSArray

    NSArray *arr = [[NSArray alloc]initWithObjects:@"1",@"2", nil];
    //浅拷贝
    NSArray *arr1 = [arr copy];
    //深拷贝,但arr内的对象(@"1",@"2")只是浅拷贝
    NSArray *arr2 = [arr mutableCopy];

6.声明NSString类型的属性时,为什么要用copy
6.1 使用retain
用NSMutableString对象 赋值给 属性时,只是retainCount+1(两个指针指向同一个对象)
属性的值会随NSMutableString对象值的 改变而改变。
6.2 使用copy
NSMutableString对象 赋值给 属性时,是深拷贝(新的对象,内存地址不同,值和原来的对象一样)
NSMutableString对象 属性的值 相互独立

正文

一、验证内存是否泄漏
项目:EasyLife
自己创建的类中也要使用dealloc
在dealloc中使用NSLog(@"%s",func);验证内存是否泄漏
二、数组
项目:MemoryManage_Array0331
+号方法和字面量 创建 数组/字典
局部变量可用,全局变量不可用,容易自动释放。
源码:

    //+号方法和字面量 创建数组/字典
    //1.+号方法
 //局部变量可用,全局变量不可用,容易自动释放。
    NSArray *arr = [NSArray arrayWithObjects:@"1", nil];
    NSLog(@"----%d",arr.retainCount);
    //2.字面量方法
    //会自动释放
    NSArray *arr2 = @[@"1",@"2"];
    NSDictionary *dict1 = @{@"1":@"键1",@"2":@"键2"};
    //2.1 以下数组可使用字面量方法:heNanArr,shanDongArr,shanXiArr,anHuiArr
 //因为_totalArr是alloc出来的,使用中,不用担心被自动释放
    NSArray *heNanArr = [[NSArray alloc]initWithObjects:@"郑州",@"平顶山",@"南阳", nil];
    NSArray *shanDongArr = [[NSArray alloc]initWithObjects:@"济南",@"日照",@"菏泽",@"烟台", nil];
    _totalArr = [[NSArray alloc]initWithObjects:heNanArr,shanDongArr, nil];
 //2.2 字面量方法相当于以下“+”号方法,
 //容易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:实现了NSCopying协议的类才能使用
②mutableCopy:实现了NSMutableCopying协议的类才能使用
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.深浅拷贝
深拷贝:对象拷贝。新对象,值相同,内存地址不同。
浅拷贝:指针拷贝。新指针,指向原来的对象。
3.1 不可变对象
copy:浅拷贝
mutableCopy:深拷贝
3.2 可变对象
copy和mutableCopy:都是深拷贝

4.对于自定义类来说,深拷贝和浅拷贝取决于,对协议方法的实现
5.NSArray

    NSArray *arr = [[NSArray alloc]initWithObjects:@"1",@"2", nil];
    //浅拷贝
    NSArray *arr1 = [arr copy];
    //深拷贝,但arr内的对象(@"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:实现了NSSCoping协议的类才能使用
    //②mutableCopy:实现了NSMutableCoping协议的类才能使用
    
    //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.深浅拷贝
    //深拷贝:对象拷贝。新对象,值相同,内存地址不同。
    //浅拷贝:指针拷贝。新指针,指向原来的对象。
    //3.1 不可变对象
    //copy:浅拷贝
    //mutableCopy:深拷贝
    NSLog(@"%p------%p------%p",text,text1,text2);//内存地址:text == text1 != text2
    //3.2 可变对象
    //copy和mutableCopy:都是深拷贝
    NSLog(@"%p======%p======%p",mText,mText1,mText2);//内存地址:均不相等
    
    //4.对于自定义类来说,深拷贝和浅拷贝取决于,对协议方法的实现
    //在People中,我们将协议方法分别实现如下改变
    //copy:深。 mutableCopy:浅。
    People *p1 = [[People alloc]init];
    People *p2 = [p1 copy];//深拷贝
    People *p3 = [p1 mutableCopy];//浅拷贝
    NSLog(@"%p======%p======%p",p1,p2,p3);//内存地址:p1 == p3 != p2
    
    //5.NSArray
    NSArray *arr = [[NSArray alloc]initWithObjects:@"1",@"2", nil];
    //浅拷贝
    NSArray *arr1 = [arr copy];
    //深拷贝,但arr内的对象(@"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];//可变对象调用copy,是深拷贝
    }
}
@end
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容