實驗代碼
#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"];
通過[NSString stringWithFormat:@”test”]分配的對象,因爲不通過alloc/new/copy/mutableCopy, 所以在ARC下,分配到堆中,但不是strong,而是autorelease。加入到autoreleasepool中的對象,在一個runloop結束是纔會釋放。而viewDidLoad和viewWillAppear是在一個runloop下的,所以在 viewWillAppear中,test指向的對象還沒有被自動釋放,正常輸出;而在viewDidAppear和viewDidLoad不在一個runloop,此時test指向的對象已經被釋放了,所以輸出(null)。
通過@”test1”賦值,實際上對象是在常量區中的。所以兩個正常輸出。
通過[[NSString alloc]initWithFormat:@”test2”]分配的對象,是alloc獲得了,因此是strong類型。因爲test3是weak型,所以在viewDidLoad結束時就釋放了,因此在viewWillAppear和viewDidAppear中,均輸出(null)。
圖
參考http://www.cnblogs.com/celestial/archive/2012/10/10/2719169.html