ここでは、ARCを使用するOS X向けのObjective-Cプログラムです。cc -fobjc-arc -o objc_arc_test objc_arc_test.m
などで構築できます。これは、alloc/initを使用するオブジェクトと、ファクトリ関数を使用するオブジェクトの2つのペアを作成します(pre-ARCコードではautorelease
を使用します)。すべての自動解放プールの外側にあり、initおよびdeallocメッセージをそのまま出力します行く。私はARCは、アロケーションを保証します+ init'dオブジェクトが破壊されているので、2、4つのオブジェクトのためのinitメッセージ、およびにdeallocメッセージを取得すると予想して、自動解放プールの不足の都合上、意志思いこれらのARCオブジェクトが一貫して動作しないのはなぜですか?
#import <Foundation/NSObject.h>
#include <stdio.h>
#if !__has_feature(objc_arc)
#error
#endif
@interface TestClass:NSObject {
int value;
}
-(TestClass *)initWithValue:(int)value;
-(void)dealloc;
+(TestClass *)testClassWithValue:(int)value;
@end
@implementation TestClass
-(TestClass *)initWithValue:(int)value_ {
if((self=[super init]))
self->value=value_;
printf("init: self=%p value=%d\n",self,self->value);
return self;
}
-(void)dealloc {
printf("dealloc: self=%p value=%d\n",self,self->value);
}
+(TestClass *)testClassWithValue:(int)value {
return [[TestClass alloc] initWithValue:value];
}
@end
static void f() {
TestClass *c5=[TestClass testClassWithValue:5];
TestClass *c6=[[TestClass alloc] initWithValue:6];
}
static void f2() {
TestClass *c7=[TestClass testClassWithValue:7];
TestClass *c8=[[TestClass alloc] initWithValue:8];
}
int main() {
f();
f2();
}
他の人は一人ままにしておきます。
しかし、私が代わりに取得すると、3、4つのオブジェクトのためのinitメッセージ、およびメッセージのdeallocです:
init: self=0x7fea20500690 value=5
init: self=0x7fea205006f0 value=6
dealloc: self=0x7fea205006f0 value=6
init: self=0x7fea205006f0 value=7
init: self=0x7fea20500700 value=8
dealloc: self=0x7fea20500700 value=8
dealloc: self=0x7fea205006f0 value=7
私はこの動作を理解していません!私は、値= 5と値= 7のオブジェクトが同じように動作することを期待しています。
なぜこれを行うのですか?
(OS X 10.11.6; Xcodeの8からApple LLVM version 8.0.0 (clang-800.0.38)
、Target: x86_64-apple-darwin15.6.0
、Thread model: posix
)