iOS内存管理之引用计数初识

@property (nonatomic, strong) NSString *para1;


@property (nonatomic, copy) NSString *para2;


@property (nonatomic, strong) NSMutableString *para3;


@end


@implementation ViewController


- (void)viewDidLoad {

    [super viewDidLoad];

    

    self.para1 = @"meng";

    self.para2 = @"zq";

    self.para3 = [[NSMutableString alloc] initWithString:@"meng123"];

    

    NSMutableArray *array = [[NSMutableArray alloc] initWithObjects:self.para1, self.para2, nil];

    [array addObject:self.para3];

    

    //para1的指针地址,para1对象的地址

    NSLog(@"%p, %p", &_para1, self.para1);

    //para2的指针地址,para2对象的地址

    NSLog(@"%p, %p", &_para2, self.para2);

    

    NSLog(@"%p, %p", &_para3, self.para3);

    

    //para1para2对象的地址相同,说明是浅拷贝

    NSLog(@"%p, %p, %p", [array objectAtIndex:0], [array objectAtIndex:1], [array objectAtIndex:2]);

    

    self.para1 = @"";

    self.para2 = @"";

    [self.para3 appendString:@"456"];

    

    //para1para2对象的地址相同,说明是浅拷贝

    NSLog(@"****%p, %p****, ****%p", [array objectAtIndex:0], [array objectAtIndex:1], [array objectAtIndex:2]);

    

    //但是打印的结果相同,说明para1para2改变的是他们的副本,而保存在数组里面的是它们的原值

    NSLog(@"%@, %@, %@", [array objectAtIndex:0], [array objectAtIndex:1], [array objectAtIndex:2]);

    

    //指针地址没变,但是指针指向的对象的地址变了,说明para1para2改变的只是它的副本

    NSLog(@"second %p, %p", &_para1, self.para1);

    NSLog(@"second %p, %p", &_para2, self.para2);

    //指针地址没变,指针指向的对象的地址也没变,说明是浅拷贝

    NSLog(@"second %p, %p", &_para3, self.para3);

    

    //para3置空,检验数组是否还有para3

    //执行次代码之后para3仍然存活,因为数组还在引用它。但我们不能假设它一定存活,释放它之后仍然打印它的地址是不好的习惯

    self.para3 = nil;

    NSLog(@"%p", self.para3);

    //因为数组在para3上调用了retain,以期继续保留para3,所以它的引用计数为2,当self.para3释放之后,数组仍然拥有para3

    NSLog(@"%p", [array objectAtIndex:2]);

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值