NSString 内分配方式以及相关ARC内容

3 篇文章 0 订阅
2 篇文章 0 订阅

实验代码

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController
id  __weak test = nil;
id  __weak test1 = nil;
id  __weak test2 = nil;

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    // autorelease 堆
    NSString *string = [NSString stringWithFormat:@"test"];
    // 指向 常量区
    NSString *string1 = @"test1";
    // strong 堆
    NSString  *string2 = [[NSString alloc]initWithFormat:@"test2"];

    test =string;
    test1 = string1;
    test2 = string2;
}

-(void)viewWillAppear:(BOOL)animated{
    NSLog(@"viewWillAppear test");
    NSLog(@"test:%@",test);
    NSLog(@"test1:%@",test1);
    NSLog(@"test2:%@",test2);
}

-(void)viewDidAppear:(BOOL)animated{
    NSLog(@"viewDidAppear test");
    NSLog(@"test:%@",test);
    NSLog(@"test1:%@",test1);
    NSLog(@"test2:%@",test2);
}

@end

实验结果

2015-03-11 14:04:02.982 MyTest[9974:780138] viewWillAppear test
2015-03-11 14:04:02.982 MyTest[9974:780138] test:test
2015-03-11 14:04:02.982 MyTest[9974:780138] test1:test1
2015-03-11 14:04:02.982 MyTest[9974:780138] test2:(null)
2015-03-11 14:04:03.006 MyTest[9974:780138] viewDidAppear test
2015-03-11 14:04:03.006 MyTest[9974:780138] test:(null)
2015-03-11 14:04:03.006 MyTest[9974:780138] test1:test1
2015-03-11 14:04:03.006 MyTest[9974:780138] test2:(null)

结论

// autorelease 堆
NSString *string = [NSString stringWithFormat:@"test"];
// 指向 常量区
NSString *string1 = @"test1";
// strong 堆
NSString  *string2 = [[NSString alloc]initWithFormat:@"test2"];
  1. 通过[NSString stringWithFormat:@”test”]分配的对象,因为不通过alloc/new/copy/mutableCopy, 所以在ARC下,分配到堆中,但不是strong,而是autorelease。加入到autoreleasepool中的对象,在一个runloop结束是才会释放。而viewDidLoad和viewWillAppear是在一个runloop下的,所以在 viewWillAppear中,test指向的对象还没有被自动释放,正常输出;而在viewDidAppear和viewDidLoad不在一个runloop,此时test指向的对象已经被释放了,所以输出(null)。

  2. 通过@”test1”赋值,实际上对象是在常量区中的。所以两个正常输出。

  3. 通过[[NSString alloc]initWithFormat:@”test2”]分配的对象,是alloc获得了,因此是strong类型。因为test3是weak型,所以在viewDidLoad结束时就释放了,因此在viewWillAppear和viewDidAppear中,均输出(null)。


代码

输出

参考http://www.cnblogs.com/celestial/archive/2012/10/10/2719169.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值