属性`copy`属性的意外结果

时间:2018-08-18 17:15:37

标签: objective-c properties copy nscopying

我已经为自己的类实现了NSCopying,当我将该类用作具有 copy 属性的属性时,我希望它应该使用 [... copy] / [... copyWithZone:] 方法。但是它返回对同一对象的引用。 但是,如果我将 copy 属性用于 NSString ,则它可以工作,或者当我直接调用 copy 方法时。 我的问题为什么 copy 属性不适用于支持NSCopying协议的自有类?

@interface A: NSObject<NSCopying>
@property(nonatomic, strong) NSNumber *num;
@end

@implementation A

- (instancetype) init {
    if(self = [super init]) {
        _num = @0;
    }
    return self;
}

- (instancetype)copyWithZone:(NSZone *)zone {
    A *newA = [A new];
    newA.num = [self.num copyWithZone:zone];
    return newA;
}

@end

@interface B: NSObject
@property(nonatomic, copy) NSString *str;
@property(nonatomic, copy) A *objA;
@end

@implementation B

- (instancetype) init {
    if(self = [super init]) {
        _objA = [A new];
        _str = @"0";
    }
    return self;
}
@end

int main(int argc, const char * argv[]) {
        B *objB = [B new];

        A *newA1 = objB.objA.copy;
        newA1.num = @1;
        NSLog(@"%@ %@", newA1.num, objB.objA.num);

        A *newA = objB.objA;
        NSString *newStr = objB.str;

        newA.num = @1;
        newStr = @"1";

        NSLog(@"%@ %@", newA.num, objB.objA.num);
        NSLog(@"%@ %@", newStr, objB.str);
    return 0;
}

输出:

1 0
1 1
1 0

预期输出:

1 0
1 0
1 0

0 个答案:

没有答案