ClassA的:
@interface ClassA : NSObject
-(void)methodA;
@end
#import "ClassA.h"
@implementation ClassA
-(void)methodA
{
ClassB *classB = [[ClassB alloc] init];
__weak NSDictionary *dic = [classB parseFile:@“AAAA”];
NSLog(@“1:%@",classB);
NSLog(@“2:%@“,dic);
classB = nil;
NSLog(@“3:%@",classB);
NSLog(@“4:%@",dic);
}
@end
ClassB的:
@interface ClassB: NSObject
-(NSDictionary *)parseFile:(NSString *)path;
@end
#import "ClassB.h"
@implementation ClassB
-(NSDictionary *)parseFile:(NSString *)path
{
NSDictionary *dicB = [[NSDictionary alloc] initWithObjectsAndKeys:@"221",@"111", nil];
return dicB;
}
- (void)dealloc
{
}
@end
的NSLog:
2014-02-15 20:46:09.382 LrcTest[4309:70b] 1:<LRCParser: 0x8c12240>
2014-02-15 20:46:09.383 LrcTest[4309:70b] 2:{
111 = 221;
}
2014-02-15 20:46:11.081 LrcTest[4309:70b] 3:(null)
2014-02-15 20:46:11.081 LrcTest[4309:70b] 4:{
111 = 221;
}
问题:
在NSlog 2中,dic唯一的强引用来自classB
当classB
设置为nil
时,它会被取消分配
在NSLog 4,为什么dic没有发布?为什么它还有价值?我看待它的方式,此时它没有强大的参考,所以它应该被释放
我错了什么?
答案 0 :(得分:2)
<强> ARC 强>:
-(NSDictionary *)parseFile:(NSString *)path
{
NSDictionary *dic = [[NSDictionary alloc] initWithObjectsAndKeys:@"221",@"111", nil];
return dic;
}
没有ARC :
-(NSDictionary *)parseFile:(NSString *)path
{
NSDictionary *dic = [[[NSDictionary alloc] initWithObjectsAndKeys:@"221",@"111", nil] autorelease];
return dic;
}
dic变量是在自动释放池中创建的,因此在从methodA返回之前不会取消分配。
答案 1 :(得分:0)
您的classB
没有通过parseFile:
方法返回的字典引用。因此,当您将nil设置为classB
时,它不会影响* dic指针。它将在您methodA
结束后立即发布