我偶然发现了一个在其他地方找不到答案的问题。当我调用一个方法,该方法返回指向稍后使用的对象的指针并最终设置为 nil 时,它仍然分配在内存中(根据 Instruments)。我正在使用 XCode 4.6.3 和 iOS 6.1。ARC 已打开。
这是示例代码:
类A.h
@interface ClassA : NSObject
-(void)runSomething;
@end
类A.m
#import "ClassA.h"
#import "ClassB.h"
@implementation ClassA
-(void)runSomething {
int counter = 0;
while (true) {
ClassB *instance = [self makeClassBWithNumber:counter];
NSLog(@"%d", [instance getNumber]);
[NSThread sleepForTimeInterval:0.01];
instance = nil;
counter++;
}
}
-(ClassB*) makeClassBWithNumber:(int)number {
return [[ClassB alloc] initWithNumber:number];
}
@end
B类.h
@interface ClassB : NSObject
@property int number;
-(id)initWithNumber:(int)number;
-(int)getNumber;
@end
B类.m
#import "ClassB.h"
@implementation ClassB
-(id)initWithNumber:(int)number {
self = [super init];
if(self) {
_number = number;
}
return self;
}
-(int)getNumber {
return [self number];
}
@end
ClassB 在视图控制器中创建并调用方法 runSomething。此示例代码生成创建的对象 (ClassB) 永远不会从内存中释放。如果我从
ClassB *instance = [self makeClassBWithNumber:counter];
至
ClassB *instance = [[ClassB alloc] initWithNumber:counter];
创建的对象在每个循环周期中被正确释放。这种行为的原因是什么?我在 stackoverflow 上找到了一些旧答案,这些答案makeClassBWithNumber
应该返回调用 autorelease 的结果return [result autorelease]
,但是如果启用了 ARC,则无法做到这一点。