Objective-C不可变对象copyWithZone:与ARC兼容的实现

dmi*_*aev 12 cocoa copy objective-c automatic-ref-counting

正如我所假设的,这应该适用于ARC下的不可变对象:

- (id) copyWithZone:(NSZone *)zone {
    return self;
}
Run Code Online (Sandbox Code Playgroud)

但如果我需要深层复制,我应该写这样的东西:

- (id) copyWithZone:(NSZone *)zone {
    Immutable *copy = [[Immutable alloc] initWithStr:str];
    return copy;
}
Run Code Online (Sandbox Code Playgroud)

所以,如果我认为是正确的,ARC会理解情况(1)和(2)并做出关于"+1"的正确决定.

我对吗 ?

dmi*_*aev 12

似乎我是对的:我找不到任何关于主题的具体文档,但是我在关闭ARC的情况下创建单独的测试项目,然后选择迁移到ARC.这是没有ARC的代码:

- (id) copyWithZone:(NSZone *)zone {
    return [self retain];
}
Run Code Online (Sandbox Code Playgroud)

这是我迁移后得到的:

- (id) copyWithZone:(NSZone *)zone {
    return self;
}
Run Code Online (Sandbox Code Playgroud)

ARC有时会起作用,但似乎我们应该相信它会很好地完成它的工作.:-)

  • @Macmade如果对象是不可变的,则返回保留指向同一对象的指针是可以接受的.NSString,NSDate等都是这样做的. (8认同)