属性是可以说是面向对象语言中封装的一个体现,在自定义类中设置属性就相当于定义了一个私有变量、设置器(setter方法)以及访问器(getter方法),其中无论是变量的定义,方法的声明和实现都是系统自动生成的并且经过了相应地内存管理和优化,无需开发者操心。

属性的声明:

属性一般定义在类的接口,或类的延展内,并且放在方法的声明之前,成员变量的声明之后。属性关键字是@property,括号内的是属性的属性,然后是变量的类型和名字,属性的定义一般分为两种情况,一种是非对象类型的变量,如int整型,使用assign,第二种是对象类型的变量,使用retain或copy,若对象类型的变量是代理,则使用assign。

属性的属性包括:

1、原子性属性:

nonatomic:非原子性,在多线程下读写速度较快但不安全。

atomic:原子性,在多线程下同一时间只允许一条线程进行访问,保证数据安全。默认。

2、语义属性:

assign:直接赋值,适用于基本数据类型和代理。

retain:赋值是使引用计数加1,适用于除代理的所有对象类型。

copy:赋值时创建一个副本,适用于除代理的所有对象类型,但会占用较多内存,谨慎使用。

3、读写属性:

readwrite:可读写,自动生成设置器和访问器。默认

readonly:只读,只生成访问器。

getter=方法名:指定访问器的方法名。

setter=方法名:指定设置器的方法名。

点语法:

per.name=? 相当于调用属性name的setter方法,?=per.name 或 per.name相当于调用name属性的getter方法。

多重点语法:首先per对象有一个Student* 的对象,这个对象又带有NSString*类型的name属性

这种情况下是先调用per属性stu的getter方法,再调用stu属性name的setter方法。

属性setter方法和getter方法的内部实现和重写:

以@property (assign,nonatomic) int age;为例

setter方法:-(void)setAge:(int)age;

getter方法:-(int)age;

内部实现:属性在默认情况下声明的私有变量名为属性名前加下划线如_age,同时在默认情况下只能重写setter和getter的其中之一,若要重写两者要实现文件加上

@synthesize关键字,如@synthesize age = _age;

@property (assign,nonatomic) int age;

@property (retain,nonatomic) NSString *name;

@property (copy,nonatomic) NSString *sex;

设置为assign的属性就是直接赋值,不必细说,而设置为retain或copy的属性都是经过内存管理和优化,所用一般用于对象类型,而代理使用assign是因为被代理方本身不持有代理的所有权,所以不需要对代理的内存进行操作,直接赋值即可,而除了代理,因为对象对自己的私有变量持有所有权,所以要对私有变量进行内存管理。在setter方法中,若不对旧值所占用内存进行释放,便会造成内存泄露,若不对新值进行retain或copy,当参数所用内存在方法外部释放时,该属性便会成为野指针。在getter方法中,若不进行retain或copy就进行return,当对象被释放后便会存在野指针,若不进行autorelease便会造成内存泄露。

自定义类属性设置及setter、getter方法的内部实现的更多相关文章

  1. 自定义类在PropertyGrid上的展示方法

    自定义类在PropertyGrid上的展示方法 零.引言 PropertyGrid用来显示某一对象的属性,但是并不是所有的属性都能编辑,基本数据类型(int, double等)和.Net一些封装的类型 ...

  2. .net使用自定义类属性

    .net中可以使用Type.GetCustomAttributes获取类上的自定义属性,可以使用PropertyInfo.GetCustomAttributes获取属性信息上的自定义属性. 下面以定义 ...

  3. java 一般类属性设置常量 用以长久使用

    java  一般类属性设置常量 用以长久使用 一直引用 例如 文件名

  4. Java反射获取对象VO的属性值(通过Getter方法)

    有时候,需要动态获取对象的属性值. 比如,给你一个List,要你遍历这个List的对象的属性,而这个List里的对象并不固定.比如,这次User,下次可能是Company. e.g. 这次我需要做一个 ...

  5. 阶段3 1.Mybatis_05.使用Mybatis完成CRUD_8 Mybatis中的返回值深入-调整实体类属性解决增和改方法的报错

    如果实体类和数据库表内的字段没有保持一致 修改了属性子弹. 重新生成getter和setter还有toString方法 测试类里面,相关set的方法就都会报错. 只需要修改为最新的set方法就可以了. ...

  6. java循环遍历类属性 get 和set值方法

    //遍历sqspb类 成员为String类型 属性为空的全部替换为"/"Field[] fields = sqspb.getClass().getDeclaredFields(); ...

  7. html5的自定义data-*属性和jquery的data()方法的使用示例

    人们总喜欢往HTML标签上添加自定义属性来存储和操作数据. 但这样做的问题是,你不知道将来会不会有其它脚本把你的自定义属性给重置掉,此外,你这样做也会导致html语法上不符合Html规范,以及一些其它 ...

  8. WPF中Image控件绑定到自定义类属性

    首先我们定义一个Student类,有ID,Name,Photo(保存图片路径). using System; using System.Collections.Generic; using Syste ...

  9. setter getter 方法

    MRC下setter.getter方法写法.重写dealloc方法 @interface People : NSObject @property (nonatomic,strong) NSString ...

随机推荐

  1. C# WebBrowser获取指定字符串的坐标

    public void FindKeyWord(string keyWord) { WebBrowser wb = new WebBrowser(); foreach (HtmlElement ite ...

  2. Leecode刷题之旅-C语言/python-344反转字符串

    /* * @lc app=leetcode.cn id=344 lang=c * * [344] 反转字符串 * * https://leetcode-cn.com/problems/reverse- ...

  3. ACM1000:A + B Problem

    Problem Description Calculate A + B.   Input Each line will contain two integers A and B. Process to ...

  4. mysql自动提交

    MySQL的autocommit(自动提交)默认是开启,其对mysql的性能有一定影响,举个例子来说,如果你插入了1000条数据,mysql会commit1000次的,如果我们把autocommit关 ...

  5. break和continue使用

    前面讲的循环,这里就是控制循环的东西 break其实在我们学习switch判断的时候就是用到了 break:代表跳出整个循环 continue和break的用法差不多 continue:代表只跳出当前 ...

  6. Scala快速入门到精通 视频教程 百度云网盘下载地址

    Scala快速入门到精通  视频教程 百度云网盘下载地址 Scala快速入门到精通 下载地址链接:https://pan.baidu.com/s/1bqGIKyF 密码:ojwd

  7. AS 3.1 多library合并打包成aar的正确方式(fat-aar)

    前言 主要参考fat-aar来合并打包. 但是这个fat-aar很久没维护了,如果直接使用它会有很多问题.由于对gradle脚本也不是太熟,就只能顺着它的意思,将gradle降级成2.2.3的版本. ...

  8. TensorFlow:在PyCharm中配置TensorFlow

    在本地配置好TensorFlow后,如何在PyCharm中配置TensorFlow呢? 只需将当前的Python编译环境配置为TensFlow安装路径中的Pyhton环境,具体操作如下: 1. 打开‘ ...

  9. iOS SSL Pinning 保护你的 API

    随着互联网的发展,网站全面 https 化已经越来越被重视,做为 App 开发人员,从一开始就让 API 都走 SSL 也是十分必要的.但是光这样就足够了吗? SSL 可以保护线上 API 数据不被篡 ...

  10. Python元组与列表的区别和联系?

    1.  元组和列表比较相似,不过它们之间也有着不同: (1)列表:一个大仓库,你可以随时往里边添加和删除任何东西. (2)元组:封闭的列表,一旦定义,就不可改变(不能添加.删除或修改). 2. 什么情 ...