我想验证一直使用的东西,但是当我想到它时...我很困惑为什么它会这样工作,我确定我读了解它但我找不到它。 据我所知,苹果创建他们的二传手就像这样。
-(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很多。 (我想我的问题可能已在论坛上提出)
答案 0 :(得分:4)
这没有任何效果,因为您正在更改s
指向的对象。
这个图可能更好地解释了它,原来你有这样的东西:
更改s
的点不会影响_string
。
设置要复制的属性的想法是,您将字符串属性设置为可变字符串,然后更改其内容。请参阅此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