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
B类:
@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 没有发布?为什么它仍然有价值?在我看来,它目前没有强有力的参考,所以它应该被发布。
我做错了什么?
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 变量是在自动释放池中创建的,因此在从方法 A 返回之前不会释放它。
您的classB
没有对通过parseFile:
方法返回的字典的引用。因此,当您将 nil 设置为 classB
时,它不会影响 *dic 指针。它将在您的methodA
结束后发布