//OC内存中的内存的难点
//1.将对象添加到数组中会增加其引用计数
Student *st = [Student new];
NSMutableArray *mArray = [[NSMutableArray alloc] init];
[mArray addObject:st];
[mArray addObject:st];
[mArray addObject:st];
NSLog(@"mArray = %ld,st = %ld",mArray.retainCount,st.retainCount);
[mArray release];
[st release];
//对于不可变数组、集合如果用[[NSArray alloc] init]方法初始化,那么他们会指向同一片内存空间,使得这一片内存的引用计数增加。
NSArray *array = [[NSArray alloc] initWithObjects:@"da",@"da", nil];
NSLog(@"array = %ld",array.retainCount);
[array release];
NSArray *array2 = [[NSArray alloc] init];
NSLog(@"array2 = %ld",array2.retainCount);
NSArray *array3 = [[NSArray alloc] init];
NSLog(@"array3 = %ld",array3.retainCount);
NSLog(@"array2 = %p,array2 = %p",array2,array3);
NSSet *set1 = [[NSSet alloc] init];
NSSet *set2 = [[NSSet alloc] init];
NSLog(@"set1 = %p,set2 = %p",set1,set2);
[array2 release];
[array3 release];
[set1 release];
[set2 release];
//不可字符串的快速初始化方法,不提供应用计算操作。
NSString *string = @"adsf";
[string retain];
NSLog(@"string = %ld",string.retainCount);
//对于copy,在不变对象时为浅拷贝,会增加对象的引用计数,返回对象地址,对于可变对象为深拷贝,不增加对象的引用计数,会复制出一个引用计数为1的副本,返回副本地址。
NSString *stringCopy1 = [[NSString alloc] initWithFormat:@"wo"];
[stringCopy1 retain];
NSString *stringCopy2 = [stringCopy1 copy];
NSMutableString * mStringCopy1 = [[NSMutableString alloc] initWithFormat:@"wo"];
NSMutableString * mStringCopy2 = [mStringCopy1 copy];
NSLog(@"stringCopy1 = {%ld,%p},stringCopy2 = {%ld,%p}",stringCopy1.retainCount,stringCopy1,stringCopy2.retainCount,stringCopy2);
NSLog(@"mStringCopy1 = {%ld,%p},mStringCopy2 = {%ld,%p}",mStringCopy1.retainCount,mStringCopy1,mStringCopy2.retainCount,mStringCopy2);
[stringCopy1 release];
[stringCopy1 release];
[stringCopy2 release];
[mStringCopy1 release];
[mStringCopy2 release];
//1.将对象添加到数组中会增加其引用计数
Student *st = [Student new];
NSMutableArray *mArray = [[NSMutableArray alloc] init];
[mArray addObject:st];
[mArray addObject:st];
[mArray addObject:st];
NSLog(@"mArray = %ld,st = %ld",mArray.retainCount,st.retainCount);
[mArray release];
[st release];
//对于不可变数组、集合如果用[[NSArray alloc] init]方法初始化,那么他们会指向同一片内存空间,使得这一片内存的引用计数增加。
NSArray *array = [[NSArray alloc] initWithObjects:@"da",@"da", nil];
NSLog(@"array = %ld",array.retainCount);
[array release];
NSArray *array2 = [[NSArray alloc] init];
NSLog(@"array2 = %ld",array2.retainCount);
NSArray *array3 = [[NSArray alloc] init];
NSLog(@"array3 = %ld",array3.retainCount);
NSLog(@"array2 = %p,array2 = %p",array2,array3);
NSSet *set1 = [[NSSet alloc] init];
NSSet *set2 = [[NSSet alloc] init];
NSLog(@"set1 = %p,set2 = %p",set1,set2);
[array2 release];
[array3 release];
[set1 release];
[set2 release];
//不可字符串的快速初始化方法,不提供应用计算操作。
NSString *string = @"adsf";
[string retain];
NSLog(@"string = %ld",string.retainCount);
/*
在UI中:
引用计数为-1,无法retain,但是用initWithForm:方法可以
但是在OC中initWithForm:方法可以也是无法改变引用计数的。
//对于copy,在不变对象时为浅拷贝,会增加对象的引用计数,返回对象地址,对于可变对象为深拷贝,不增加对象的引用计数,会复制出一个引用计数为1的副本,返回副本地址。
NSString *stringCopy1 = [[NSString alloc] initWithFormat:@"wo"];
[stringCopy1 retain];
NSString *stringCopy2 = [stringCopy1 copy];
NSMutableString * mStringCopy1 = [[NSMutableString alloc] initWithFormat:@"wo"];
NSMutableString * mStringCopy2 = [mStringCopy1 copy];
NSLog(@"stringCopy1 = {%ld,%p},stringCopy2 = {%ld,%p}",stringCopy1.retainCount,stringCopy1,stringCopy2.retainCount,stringCopy2);
NSLog(@"mStringCopy1 = {%ld,%p},mStringCopy2 = {%ld,%p}",mStringCopy1.retainCount,mStringCopy1,mStringCopy2.retainCount,mStringCopy2);
[stringCopy1 release];
[stringCopy1 release];
[stringCopy2 release];
[mStringCopy1 release];
[mStringCopy2 release];