昔ながらの c-array に保存した Objective-C オブジェクトを解放する方法がわかりません。
(注:これを書いているときに、多くの検索を行った後、テストコードにバグを見つけたと思うので、これは質問ではなく解決策のようです。まあ、私はそれに多くの時間を費やしたので投稿しますとにかく…)
古いコードを ARC に変換したいのは、メモリ管理関連のバグのデバッグに多くの時間を費やしているためです (申し訳ありませんが、保持/解放ルールは単に私の背骨に組み込まれておらず、文字通り何時間もかかります)おそらくメモリのクリーンアップ中または後に、無関係な瞬間にエラーがポップアップするため、失われた保持を見つけるため)。
したがって、C スタイルの配列 ( の 2 次元配列など) を使用した既存のコードがいくつかあります。ここでは、ポインターをUILabel*
喜んで使用して、 some を介してそれらにアクセスできます。s がランダムな順序で満たされていると仮定しましょう。そのため、 an は使用できません。calloc()
array[col*colstride+row*rowstride]
array
UILabel **
UILabel*
NSMutableArray
現在、ARC では、コンパイラーは の型を にするように求めてarray
いるUILabel *__strong*
ようです (一部の人はそれを と書いています__strong UILabel **
)。
私が理解していないのは、オブジェクトを解放するUILabel
ときにARCにオブジェクトを解放するように指示する方法です(たとえばdealloc()
、c-arrayを使用するオブジェクトで)。問題を理解しようとして、オブジェクトの小さなセットがありMemory
、MemoryUnit
前者は後者の大きな c-array を格納しようとしています。
-(Memory*)init {
self = [super init];
if (self) {
MemoryUnit * unit = [[MemoryUnit alloc] init];
array = (__strong id *) calloc(sizeof(MemoryUnit*), 1024);
array[0] = unit;
}
return self;
}
-(void)dealloc {
for (int i=0; i<1024; i++) array[i]=nil;
free(array);
}
MemoryUnit
c-array に格納するオブジェクトがあります (これは上記MemoryUnit
の場所にあります)。UILabel
テストのために、私はコードを持っていました
-(void)dealloc {
NSLog(@"removed %x", (int)self);
}
dealloc()
デバッグ用です。