zoukankan      html  css  js  c++  java
  • OC 实例变量(instance var)与属性(@property)的关系 isa指针

    实例变量(instance var)与属性(@property)的关系

     

          Objective-C 2.0之后,声明一个@property name自动产生一个实例变量,名为_name,因此省去实例变量和属性重复输入的麻烦。而使用@synthesize可以改变_name名称。@property和@synthesize不必成对出现。

     

    @property name:指示编译器自动合成setter和getter方法,setter方法名即setName,而getter方法名即name。@property后面的关键字,例如readonly、readwrite、retain、nonatomic、copy等,指定如何生产setter和getter方法。这些属性修饰符大致分为四类:

    (1)可变性 (Mutability)

    - readonly,只生成getter方法,没有setter方法

    - readwrite,是默认的

    (2)内存管理 (Memory management)

    - assign,是默认的,适用于内置类型(int, bool等)或者代理对象(delegate),不存在引用计数机制。

    - retain,只适用于对象,不适用内置类型(int, bool等)。当使用setter方法时,将对象的引用计数加1。

    - copy,使用setter方法时,拷贝一个对象,即在内存中产生新对象,而不是把原来的对象的引用计数加1。显然,复制出来的新对象的引用计数为1。

    (3)并发性 (Concurrency)

    - nonatomic,访问属性非原子性,一般单线程声明nonatomic,考虑到速度问题。多线程程序就不要使用nonatomic。

    - atomic,访问属性原子性,与nonatomic相反。

    (4)API控制 (API control)

    - getter=newGetterName,指定新的getter方法名,一般重新改写BOOL实例变量的getter名。例如

    1. @property (getter=isFinished) BOOL finished;  

    - setter=,指定新的setter方法名。

    @synthesize name = custom_name:将实例变量_name名称换成custom_name

    @synthesize name:将实例变量_name名称换成name

    注意:@synthesize不会影响@property产生的setter和getter方法的名称

     

    setter和getter方法什么时候被调用?

    例如,属性声明如下

    1. @interface Person : NSObject  
    2. @property NSString *firstName; // atomic, assign, readwrite (default)  
    3. @end 

    有2种方法:

    (1)显示调用(发送消息)

    1. [somePerson firstName]; // Call getter method  
    2. [somePerson setFirstName: @"Johnny"]; // Call setter method  

    (2)隐式调用(点语法)

    1. NSString *firstName = somePerson.firstName; // Call getter method  
    2. somePerson.firstName = @"Johnny"; // Call setter method  

    如果在实例方法中直接使用实例变量,则不会调用对应的setter和getter方法,例如

    1. - (void)someMethod  
    2. {  
    3.      NSString *myString = _firstName; // Won't call getter method  
    4.      _firstName = @"A string"; // Won't call setter method  
    5. }  

    显然直接使用实例变量会有风险,如内存泄露、循环引用等。最好访问实例变量,都通过@property产生的setter和getter方法。

  • 相关阅读:
    iOS微信支付集成
    iOS支付宝支付集成
    JavaScript原生实现《贪吃蛇》
    安装tensorflow的最简单方法(Ubuntu 16.04 && CentOS)
    Eclipse 插件管理
    settings.xml 文件配置
    Spring MVC 起步
    机器学习: KNN--python
    Python: PS 图像调整--亮度调整
    计算机设计思想 —— 代理(proxy)
  • 原文地址:https://www.cnblogs.com/oc-bowen/p/5016901.html
Copyright © 2011-2022 走看看