他の場所で答えが見つからない問題に出くわしました。後で使用され、最後に 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
View ControllerにClassBを作成し、runSomethingメソッドを呼び出します。このサンプル コードでは、作成されたオブジェクト (ClassB) がメモリから解放されることはありません。コードを変更すると
ClassB *instance = [self makeClassBWithNumber:counter];
に
ClassB *instance = [[ClassB alloc] initWithNumber:counter];
作成されたオブジェクトは、各ループ サイクルで適切に解放されます。そのような行動の理由は何ですか?makeClassBWithNumber
ここで、 autorelease を呼び出す結果を返すはずの古い回答がいくつか見つかりましたreturn [result autorelease]
が、ARCが有効になっている場合、これは実行できません。