您的位置:威尼斯官方网站 > 威尼斯正规官网 > 威尼斯官方网站:即为str指向的地址

威尼斯官方网站:即为str指向的地址

发布时间:2019-10-02 02:51编辑:威尼斯正规官网浏览(147)

    iOS开辟中时时会遇上关于NSString属性的扬言,在ARC下,NSString属性的扬言有八个特征关键字可选:copy和strong;那么难点来了,几时用copy?哪天用strong?

    自家在底下轻易举个栗子,希望大家能看懂,也请途经的大神指教!

    小编新建了二个UIViewController,然后在.h文件中宣称七个NSString属性,如下:

    @property(nonatomic, strong)NSString *strongName;

    @property(nonatomic,copy)NSString *copyyName;

    NSString *str = [NSString stringWithFormat:@"hello, boys"];

    _strongName = str;

    _copyyName = str;

    NSLog(@"origin string: %p, %p, %@",str, &str, str);

    NSLog(@"strong string: %p, %p, %@",_strongName, &_strongName, _strongName);

    NSLog(@"copy string: %p, %p, %@", _copyyName, &_copyyName, _copyyName);

    接下来大家运营一下,打字与印刷是那样的:

    威尼斯官方网站 1NSString赋值

    这种景色下,不管是strong依旧copy属性的靶子,其针对性的地点都以同三个,即为str指向的地址。

    NSMutableString *str = [NSMutableString stringWithFormat:@"hello, boys"];

    _strongName = str;

    _copyyName = str;

    [str setString:@"hello, girls"];

    NSLog(@"origin string: %p, %p, %@",str, &str, str);

    NSLog(@"strong string: %p, %p, %@",_strongName, &_strongName, _strongName);

    NSLog(@"copy string: %p, %p, %@", _copyyName, &_copyyName, _copyyName);

    下一场大家运转下改后的,打字与印刷如下:

    威尼斯官方网站 2NSMutableString赋值

    见状此间,也会有同学会问:为何strong和copy属性的靶子,其针对性的地点还都以str指向的地点?为何_copyyName的值会产生“hello, girls”呢?不该是“hello, boys”吗?小编先不解释,我们随后往下看。

    NSMutableString *str = [NSMutableString stringWithFormat:@"hello, boys"];

    self.strongName = str;

    self.copyyName = str;

    [str setString:@"hello, girls"];

    NSLog(@"origin string: %p, %p, %@",str, &str, str);

    NSLog(@"strong string: %p, %p, %@",_strongName, &_strongName, _strongName);

    NSLog(@"copy string: %p, %p, %@", _copyyName, &_copyyName, _copyyName);

    然后大家运维下改后的,打字与印刷如下:

    威尼斯官方网站 3NSMutableString赋值1

    OK,那回大家看出梦想观察的结果了,_copyyName还是是“hello, boys”,而尚未成为“hello, girls”,_copyyName指向的地址不再是str指向的地址。留心地同学会发掘第三种和第二种比除了将_copyyName = str改为self.copyyName = str,_strongName = str改为self.strongName = str外,其他完全一致。也正是说因为我们将_copyyName = str改为self.copyyName = str才导致了_copyyName的值在第三种状态下依旧未有改观,那是怎么呢?

    当大家用@property来声称属性别变化量时,编写翻译器会活动(@syntheszie copyyName = _copyyName)为我们转移对应的三个以下划线加属性名命名的实例变量,还会有其对应的getter、setter方法,当大家用self.copyyName = str赋值时,会调用copyyName的setter方法,而用_copyyName = str赋值是给_copyyName实例变量直接赋值,并不会调用copyyName的setter方法,而在setter方法中有三个十三分首要的说话:

    _copyyName = [copyyName copy];

    其二种景况中用self.copyyName = str赋值时,调用copyyName的setter方法,setter方法对传播的copyyName做了深拷贝生成二个新的指标赋值给_copyyName,所以_copyyName指向的地点和值都不再和str同样。

    看了标题有同学要以为意外了,为啥又和第一种同等了?

    在此处作者将代码改成了这样

    NSString *str = [NSString stringWithFormat:@"hello, boys"];

    self.strongName = str;

    self.copyyName = str;

    NSLog(@"origin string: %p, %p, %@",str, &str, str);

    NSLog(@"strong string: %p, %p, %@",_strongName, &_strongName, _strongName);

    NSLog(@"copy string: %p, %p, %@", _copyyName, &_copyyName, _copyyName);

    那边自个儿将首先种中的_copyyName = str改成了self.copyyName = str,那时候打字与印刷会是何等的呢?

    咱俩来看一下:

    威尼斯官方网站 4NSString赋值1

    看了打印,有同学会以为意外,为何用了self.copyyName = str实行赋值,调用了setter方法,调用了_copyyName = [copyyName copy],之后_copyyName指向的地方和str指向的地址依然一直以来的啊?因为在这里copy是浅拷贝,并从未调换新的靶子。

    ps:内容中只要有何样地点有错的话,还请途经的诸位大神指正!

    本文由威尼斯官方网站发布于威尼斯正规官网,转载请注明出处:威尼斯官方网站:即为str指向的地址

    关键词:

上一篇:成员变量

下一篇:没有了