OC学习:OC内存中的内存的难点

来源:互联网 发布:苹果系统基于linux 编辑:程序博客网 时间:2024/06/05 18:53
//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);

    /*

    在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];
0 0
原创粉丝点击