2014-06-14 122 views
0

我想验证一些我总是使用的东西,但是当我考虑它时...我感到困惑为什么它以这种方式工作,我确定我阅读了有关它的解释,但无法找到它。 据我了解苹果创建他们的setter是这样的。更改属性对象不会影响属性

-(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中我可以看到我的属性指向了我更改的对象,但属性值将是相同的。这种情况触发另一个问题(如果它的工作原理为什么我需要复制属性)。 有人可以提供一个简短的解释吗? (或具体链接阅读)。 Tnx很多。 (我觉得我的问题可能已经要求在论坛)

+0

您断言“应该删除字符串”首先是错误的。只需设置NULL的引用与它指向的对象的释放无关。 – erkanyildiz

+0

你没事,如果我有机会,我会删除那个愚蠢的问题。 –

回答

4

,没有任何效果,因为你改变了对象,该s点。

这个图或许可以解释它更好,原来你是这样的:

enter image description here

改变的s点不会影响_string

enter image description here

设置复制的属性的想法是如果你的字符串属性设置为可变的字符串,然后改变它的内容。看到这个question

+0

是的,你完全正确,我不会在发布这类问题时想到的。 –

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