更改属性对象不会影响属性

时间:2014-06-14 19:37:49

标签: ios objective-c

我想验证一直使用的东西,但是当我想到它时...我很困惑为什么它会这样工作,我确定我读了解它但我找不到它。 据我所知,苹果创建他们的二传手就像这样。

-(void)setString:(NSString *)value {
   if (_string != value) {
      [_string release];
      _string = [value retain];
   }
}

现在通常我会创建这样的属性。

@property (nonatomic) NSString *string;
@synthesize string = _string;

问题是关于下一个代码:

        NSString *s = @"Should be deleted";
        [self setString:s];
        NSLog(@"string check111 =%@",self.string);
        s = NULL;
        NSLog(@"string check222=%@",self.string);

将生成相同的输出。从setter我可以看到我的属性指向我更改的对象,但属性值将是相同的。这种情况会触发另一个问题(如果它的工作原理就是为什么我需要 copy 属性) 。 有人可以提供简短的解释吗? (或具体链接阅读)。 Tnx很多。 (我想我的问题可能已在论坛上提出)

2 个答案:

答案 0 :(得分:4)

这没有任何效果,因为您正在更改s指向的对象。

这个图可能更好地解释了它,原来你有这样的东西:

enter image description here

更改s的点不会影响_string

enter image description here

设置要复制的属性的想法是,您将字符串属性设置为可变字符串,然后更改其内容。请参阅此question

答案 1 :(得分:1)

我想这会是这样的

    NSString *s = @"Should be deleted"; // create autoreleased string
    [self setString:s]; // retain string
    NSLog(@"string check111 =%@",self.string);
    s = NULL; // reset pointer value to null. This operation doesn't affect string object
    NSLog(@"string check222=%@",self.string);
    // string's retain counter will be decreased by autorelease pool later