0

ARCに関して私が理解していないことが1つあります。それは、を使用して作成されたローカル変数をどのように処理する必要があるかということ[... copy]です。フラグ付きのプロパティを作成すると(copy)、ARCはこれを自動的に処理しますが、私が知る限り、__copy変数のフラグはありません。

私はそのようなコードでこれをテストしました:

@interface Foo : NSString
@end

@implementation Foo

- (void) dealloc {
  NSLog(@"%p deallocated", self);
}

- (NSUInteger) length {
  return 1;
}

- (unichar) characterAtIndex: (NSUInteger) i {
  return 'x';
}

@end

- (void) foo {
  Foo *f = [[Foo alloc] init];
  NSLog(@"%p", f);

  Foo *f2 = [f copy];
  NSLog(@"%p", f2);
}

私が得るものは:

0x102406530
0x102015f10
0x102406530 deallocated

「0x102015f10の割り当てが解除されました」というメッセージが表示されません。これは、コピーされた変数が解放されないことを示しています。[Foo foo]自動解放されたオブジェクトを返す別のメソッドを作成したときに、しばらくしてから「割り当て解除」メッセージが表示されたため、自動解放されません。

それで、プロパティに変換せずにリリースさせる方法はありますか?

4

1 に答える 1

1

わかりました、私の悪い点-ARCは実際にコピーされたオブジェクトを適切に処理します。テストにNSStringを使用したため、明示的に実装するのではなく、すでにコピーを実装したクラスを使用したかったため、間違った結果が得られました。copyWithZone:NSObjectを継承し、を返すことで実装するクラスでテストを繰り返すと、[[Foo alloc] init]2つの「割り当て解除された」メッセージが表示されました。それを指摘してくれた@Paul.sに感謝します。

于 2012-11-03T23:02:56.020 に答える