是否可以使用ARC在ObjC中调用[obj copy]?

时间:2012-11-03 22:29:34

标签: objective-c memory-management copy automatic-ref-counting autorelease

关于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]返回一个自动释放的对象时,我确实得到了一个“解除分配”的消息。

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

1 个答案:

答案 0 :(得分:1)

好的,我的坏 - ARC确实正确地处理了复制的对象。由于使用NSString进行测试,我得到了错误的结果,因为我想使用已经实现复制的类而不是显式实现它;当我在继承自NSObject的类上重复测试并通过返回copyWithZone:实现[[Foo alloc] init]时,我得到了两个“释放”消息。感谢@ Paul.s指出了这一点。