zoukankan      html  css  js  c++  java
  • Objective-C中的属性机制

      Objective-C 2.0中的属性机制为我们提供了便捷的获取和设置实例变量的方式,也可以说属性为我们提供了一个默认的设置器和访问器的实现。在学习OC中属性之前我们先要知道为什么要为变量实现getter和setter方法,我们先来了解一下实例的作用域。

        实例变量的作用域如下:

            1. @public : 共有的,该实例变量谁都可以访问;

            2.@protected :受保护的,该实例变量只能在该类和其子类内访问,父类protected的实例变量在子类中是private的默认是protected;

            3.@private: 私有的,该实例变量只能在该类的内部访问;

            因为要用protected 或者 private来隐藏类的内部细节,用类或者对象是没法直接访问被隐藏的细节的,所以要用getter和setter来访问被隐藏的实例变量,OC中的属性机制就为我们提供了默认的getter和setter方法。下面我们要学习一下OC中的属性机制。

            属性的定义和实现

            1.属性的定义

           属性的定义用编译器命令@property来定义,比如要为私有的变量 int a;定义getter和setter方法,@property int a;  用@property会自动的为修饰的变量加上

         getter和setter方法。

            Demo如下:  

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    @interface Student : NSObject
    {
        NSString *name;
        int idNumber;
    }
    //定义属性
    @property NSString *name;
    @property int idNumber;
     
    //定义其他方法
    @end

            2.属性的实现

            在实现文件中我们用@synthesize来实现,用@synthesize来修饰相应的变量就起到类getter 和 setter 的方法实现的作用。用@synthesize也可以给函数改名用@synthesize name = otherName; 就可以给方法改名。

                demo如下

    1
    2
    3
    4
    @implementation Student
     @synthesize name, idNumber;
        //其他方法的实现
    @end

        ​    ​3.定义后属性的使用

        ​    ​在使用getter和setter方法时有一点要注意:以neme为例,getter方法名为 name, 而setter的名为 setName;在使用getter和setter方法时和普通的函数用法一样

        ​

    1
    2
    3
    4
    //调用name的setter方法
    [student setName : @"ludashi"];
    //调用name的getter方法
    NSString *name = [student name];

        ​    ​getter和setter方法也可以用点语法来实现

    1
    2
    3
    4
    5
    //name的setter方法也可以这样写
    student.name  =  @“ludashi”;
     
    //name的getter方法也可以这样写
    NSString *name = student.name;

    ​     ​    上面调用getter和setter方法的方式看着想是直接操作类的属性,其实不然,也是通过方法来操作的。

        ​4.property有关的语法

        ​    ​1.自定义存取方法名

        ​    ​    ​系统默认的存方法是setPropertyName, 默认的取方法是propertyName。可以用以下方式来更改setter和getter方法的名字

        ​    ​    ​(1)用getter = getterName来指定getter自定义的名称

        ​    ​    ​    ​    ​demo:  @property (getter = getterName) NSString *name;

        ​    ​    ​(2)用setter = setterName来指定setter自定义方法的名称

        ​    ​    ​    ​    ​demo: @property (setter = setterName) NSString *name;

        ​    ​2. property的可读写性

        ​    ​    ​property的可读写性决定属性是否有setter方法

        ​    ​    ​(1)readwrite : 指定属性是可读写的,这是默认值,因此可以省略

        ​    ​    ​    ​    ​  @property (readwrite) NSString *name;

        ​    ​    ​  (2) readonly : 指明属性是只读的。系统不会setter方法,但有getter方法

        ​    ​    ​    ​    ​  @property (readonly) NSString *name;

        ​   3.用于setter中的语义 :决定了以何种方式对数据成员赋予新值

        strong : 表示强引用关系,即拥有对象的所有权。

        weak : 表示弱引用,不拥有对象的所有权,当目标对象被销毁之后,属性值会被自动设为nil;

        ​    ​    ​assign(赋值): 直接赋值,计数器不会加一,简单的赋值方法,默认赋值方式,适合基本数据类型

        ​    ​    ​copy(拷贝):把原来的对象拷贝过来,计数器会加一,比如原来对象的地址为0x01 ,拷贝过来的对象的地址为0x02;

        ​    ​    ​retain(保留):这种方式传递的是指针,原有的对象和被赋值的对象的地址是一样的

        ​    ​

        ​   4.原子操作

        ​    ​    ​    ​atomic: 线程安全的;

        ​    ​    ​    ​nonatomic: 线程不安全的;

      我们可以简写属性,直接在接口文件中吧{}省略掉,直接用@property来定义方法,省去实现文件中的@synthesize, 访问属性时用_propertyName, 给属性赋值时用self.propertyName

  • 相关阅读:
    Qt5.3.2(VS2010)_调试_进入Qt源码
    Qt5.3.2(VS2010)_调试_遇到的问题
    Qt_QString::split测试
    Qt_QString.indesOf和mid测试
    激活_目标窗口
    DrawDibDraw__ZC测试
    【转】DrawDibDraw
    数学运算_基本_01
    get和post请求及进程和线程及cookie和session的区别
    Redis性能优化之redis.cnf配置文件
  • 原文地址:https://www.cnblogs.com/zhangkeyu/p/6659337.html
Copyright © 2011-2022 走看看