NSString 內分配方式以及相關ARC內容

實驗代碼

#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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章