实验代码
#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