• Objective-C property属性解析


    @interface …
    @property (原子性,可写性,内存管理) id name;
    @end
    原子性:    nonatomic, atomic   默认atomic
    可写性:    readwrite, readonly  默认readwrite
    内存管理: assign, retain, copy  默认assign
     

    默认值:

    因为这几个属性都有默认值,所以可以任意指定某个属性或者完全不指定:
    @property id name; //等价于下一行:
    @property (atomic, readwrite, assign) id name;

    可写性:

    @property id name 会生成两个setter,getter两个访问接口
    -(void) setName:(id)name;
    -(id) name;
    因此readonly说的是只生成getter函数不生成setter函数,默认值说的是两者都生成
     

    内存管理:

    assign 说的是接口任何时候都不会修改对象引用;
    retain 说的是调用setter时会release前一个对象再retain新对象;调用getter时会retain;
    copy   说的是调用setter时会copy新对象, release 前一个对象;调用getter时会retain;
     
    @property (assign) id name; 等价于
    -(void) setName: (id) aName
    {
      self.name = aName;
    }
     
    -(id) name
    {
      return self.name;
    }
    @property (retain) id name; 等价于
    -(void) setName: (id) aName
    {
      if ([self.name retainCount > 0])
      {
        [self.name release];
      }
     
      [aName retain];
      self.name = aName;
    }
     
    -(id) name
    {
      [self.name retain];
      return self.name;
    }
    @property (copy) id name; 等价于
    -(void) setName: (id) aName
    {
      if ([self.name retainCount > 0])
      {
        [self.name release];
      }
     
      self.name = [copy aName];
    }
     
    -(id) name
    {
      [self.name retain];
      return self.name;
    } 

    结论:

    除了assign属性,使用时必须release对象,否则会内存泄漏!那这样也太麻烦了,感谢ARC
  • 相关阅读:
    4. 单向循环链表
    3. 单向链表
    2. 队列的实现
    1. 时间复杂度(大O表示法)以及使用python实现栈
    Ubuntu16.04LTS安装集成开发工具IDE: CodeBlocks 和Eclipse-cdt
    Ubuntu16.04搭建各种开发环境的IDE: QT5 , CodeBlocks ,eclipse-cdt, PyCharm
    python2和python3 分别连接MySQL的代码
    面向对象基础
    文件的处理
    离散表(哈希表),深浅拷贝
  • 原文地址:https://www.cnblogs.com/code-style/p/3956429.html
Copyright © 2020-2023  润新知