0

关于 ARC,我不明白一件事:我们现在应该如何处理使用创建的局部变量[... 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 deallocated”,这表明复制的变量没有被释放。它甚至没有自动释放,因为当我创建另一个[Foo foo]返回自动释放对象的方法时,我确实在片刻后收到了“已释放”消息。

那么有什么方法可以在不将其转换为属性的情况下释放它?

4

1 回答 1

1

Ok, my bad - ARC does actually handle copied objects properly. I got wrong results because of using NSString for the test, because I wanted to use a class that already implemented copying instead of implementing it explicitly; when I repeated the test on a class inheriting from NSObject and implementing copyWithZone: by returning [[Foo alloc] init], I got two "deallocated" messages. Thanks to @Paul.s for pointing that out.

于 2012-11-03T23:02:56.020 回答