zoukankan      html  css  js  c++  java
  • 成员变量NSString类型指针的属性为什么用copy(属性)

    • 创建一个分类Person设置属性@property(nonatomic,strong) NSString * name;

    • 在- (void)viewDidLoad 中打印测试

    • name的属性是strong,则给name赋值的时候是强指针的name指向了可变的str的内存空间,从打印地址的结果知道,per.name 与str的地址一样,如果对可变的str做了改动( [str setString:@"好啊好啊"]),则per.name的值也会相应改变(因为他们指向的是同一个内存地址).然而这不是我们想要的结果.

    • 如果给per.name赋值了一个不可变的字符串..就不用说了,指向同一个内存地址,都不可以改变.


    • 给指针name换成copy属性

    • 在- (void)viewDidLoad 中打印测试

    • 从打印结果可以看到per.name 与可变的 str不是同一个内存地址.per.name与str是两个完全不想关的对象,则对可变的str做修改,完全不影响per.name的值.
      *如果试图对per.name做修改[per.name setString:@"hello"] ---不可以---我们的目的已经达到.

    • 把per.name赋值给不可变的str测试

    • 地址相同,不可改变.只是引用计数器+1

    一个对象的准确类型取决于被分配的内存空间的类型

    小结:

    • NSString的指针建议使用copy属性,它指向的如果是可变的NSMutablestring的str,则会创建新的对象(开辟新的内存空间),对原对象str做修改不会影响per.name的值.并且per.name也不能改变
    • per.name指针属性是copy,指向的不变的NSString的str,则不会创建新对象,只是引用计数+1
    • per.name指针的属性是strong的时候,如果per.name指向了课变的NSMutablestring的str,则str与per.name指针指向了同一个内存地址,str做出修改,per.name也会跟着变.
      *per.name指针的属性是strong的时候,如果per.name指向了不可变的NSString则都不能改变.
    • 总之:NSString用copy属性,都不可改变per.name的值.strong属性,看情况.
  • 相关阅读:
    DAY 179 在Flask中使用MongoDB:Flask-MongoEngine
    DAY 178 oracle基础
    DAY 177 mongoengine
    DAY 176 redis教程
    存储器
    cpu
    java 类文件类型
    线程池
    CopyOnWrite容器
    ConcurrentHashMap
  • 原文地址:https://www.cnblogs.com/adampei-bobo/p/5301049.html
Copyright © 2011-2022 走看看