专栏首页青玉伏案Objective-C中的属性机制

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如下:  

@interface Student : NSObject
{
    NSString *name;
    int idNumber;
}
//定义属性
@property NSString *name;
@property int idNumber;
 
//定义其他方法
@end

  2.属性的实现

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

            demo如下

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

​3.定义后属性的使用

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

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

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

//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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 窥探Swift之别具一格的Struct和Class

      说到结构体和类,还是那句话,只要是接触过编程的小伙伴们对这两者并不陌生。但在Swift中的Struct和Class也有着令人眼前一亮的特性。Struct的功...

    lizelu
  • JavaEE开发之Spring中的依赖注入与AOP编程

    上篇博客我们系统的聊了《JavaEE开发之基于Eclipse的环境搭建以及Maven Web App的创建》,并在之前的博客中我们聊了依赖注入的相关东西,并且使...

    lizelu
  • JavaSE高级之集合类

    ​下面的内容是对java中的集合类进行的总结,过段时间会分享java的网路编程,多线程等内容,欢迎批评指正。 1.Java中的集合是用来存放对象的,即集合是对象...

    lizelu
  • Python 中的魔术方法

    __new__(self): 创建并返回一个类的实例,而__init__只是将传入的参数来初始化该实例,一般不需要重载__new__方法除非希望控制类的创建。

    Ewdager
  • 腾讯青少年科技学院开启“云见习”,解锁多样化互联网职业体验!

    ? 青春须早为。曾经的你是否有着成为老师、警察、律师甚至是航天员的梦想?随着科技发展,互联网产业应运而生,世界这么大,如今的青少年对自己未来的职业发展也有了更...

    鹅老师
  • Velocity模版自定义标签

    加上 <property name="toolboxConfigLocation" value="/WEB-INF/velocity-toolbox.xml"...

    試毅-思伟
  • IOS UIResponder 触碰拖动图像

    override func touchesMoved(_ touches:Set<UITouch>, with event:UIEvent?) { //需要先...

    用户5760343
  • 宅在家学不进去吗?试试这些 GitHub 上简单易学的游戏项目吧

    这是本人宅在家里的第 4 周,代码不想看,技术文章不想读,都不能愉快学习了我还怎么当一个优秀的需求消化师呢?有没有什么轻松地方法来学习技术呢?想起了小时候金山打...

    五分钟学算法
  • 软件工程---博客系统开发文档

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

    葆宁
  • 套路还是技巧?设计师如何更好的面试?

    静电说:在担任设计Leader的职业生涯中,我面试过不少设计师,有的给人感觉很不自信,有的则机灵懂事,有些不善言辞,有些夸夸其谈。有的自我介绍环节也很没有逻辑感...

    用户5009027

扫码关注云+社区

领取腾讯云代金券