大綱
一弦悉、驗證內(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