我偶然发现了一个在其他地方找不到答案的问题。当我调用一个返回指向稍后使用的对象的指针并最终设置为 nil 的方法时,它仍然分配在内存中(根据 Instruments)。我正在使用 XCode 4.6.3 和 iOS 6.1。 ARC 已打开。
这是示例代码:
ClassA.h
@interface ClassA : NSObject
-(void)runSomething;
@end
ClassA.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
ClassB.h
@interface ClassB : NSObject
@property int number;
-(id)initWithNumber:(int)number;
-(int)getNumber;
@end
ClassB.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];
to
ClassB *instance = [[ClassB alloc] initWithNumber:counter];
创建的对象在每个循环周期中都被正确释放。这种行为的原因是什么?我在 stackoverflow 上找到了一些旧答案makeClassBWithNumber
应该返回调用自动释放的结果return [result autorelease]
,但是如果启用了 ARC,则无法完成此操作。