现在的位置: 首页 > 综合 > 正文

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

2018年05月26日 ⁄ 综合 ⁄ 共 2103字 ⁄ 字号 评论关闭

实验代码

#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

抱歉!评论已关闭.