代码:
__weak id reference = nil;
__weak id reference2 = nil;
__weak id reference3 = nil;
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
NSArray *arr = [NSArray arrayWithObject:@(92)];
reference = arr;
@autoreleasepool {
NSArray *arr2 = [NSArray arrayWithObjects:@(22), @(33), [NSString stringWithFormat:@"i was a string"], nil];//[NSString stringWithFormat:@"i was a string"] 在堆里;@(22), @(33) 是常量,一直有。
reference2 = arr2;
[arr2 enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
if (!stop) {
NSLog(@"stop");
}
if (idx==2) {
reference3 = obj;
}
NSLog(@"reference3 %@", reference3);
NSLog(@"enumerate:%@ %lu %p", obj, (unsigned long)idx, stop);
}];
NSLog(@"reference3 %@", reference3);
NSLog(@"%@", [reference3 stringByAppendingFormat:@"hello"]);
NSLog(@"reference2 %@", reference2);
}
// reference3 = @"123";
NSLog(@"%@", [reference3 stringByAppendingFormat:@"hello"]);
NSLog(@"reference3 %@", reference3);
NSLog(@"reference2 %@", reference2);
}
- (void)viewWillAppear:(BOOL)animated{
[super viewWillAppear:animated];
NSLog(@"viewWillAppear:%@", reference);
NSLog(@"reference3 %@", reference3);
}
- (void)viewDidAppear:(BOOL)animated{
[super viewDidAppear:animated];
NSLog(@"viewDidAppear:%@", reference);
[reference removeAllObjects];
NSLog(@"reference3 %@", reference3);
}
2015-04-01 14:02:20.632 AutoreleaseTest[1904:567209] reference3 (null)
2015-04-01 14:02:20.632 AutoreleaseTest[1904:567209] enumerate:22 0 0x7fff5d363a1f
2015-04-01 14:02:20.633 AutoreleaseTest[1904:567209] reference3 (null)
2015-04-01 14:02:20.633 AutoreleaseTest[1904:567209] enumerate:33 1 0x7fff5d363a1f
2015-04-01 14:02:20.633 AutoreleaseTest[1904:567209] reference3 i was a string
2015-04-01 14:02:20.633 AutoreleaseTest[1904:567209] enumerate:i was a string 2 0x7fff5d363a1f
2015-04-01 14:02:20.633 AutoreleaseTest[1904:567209] reference3 i was a string
2015-04-01 14:02:20.633 AutoreleaseTest[1904:567209] i was a stringhello
2015-04-01 14:02:20.633 AutoreleaseTest[1904:567209] reference2 (
22,
33,
"i was a string"
)
2015-04-01 14:02:20.633 AutoreleaseTest[1904:567209] (null)
2015-04-01 14:02:20.633 AutoreleaseTest[1904:567209] reference3 (null)
2015-04-01 14:02:20.633 AutoreleaseTest[1904:567209] reference2 (null)
2015-04-01 14:02:20.633 AutoreleaseTest[1904:567209] viewWillAppear:(
92
)
2015-04-01 14:02:20.633 AutoreleaseTest[1904:567209] reference3 (null)
2015-04-01 14:02:20.643 AutoreleaseTest[1904:567209] viewDidAppear:(null)
2015-04-01 14:02:20.647 AutoreleaseTest[1904:567209] reference3 (null)
在没有手加Autorelease Pool的情况下,Autorelease对象是在当前的runloop
迭代结束时释放的,而它能够释放的原因是系统在每个runloop迭代中都加入了自动释放池Push和Pop.