属性是可以说是面向对象语言中封装的一个体现,在自定义类中设置属性就相当于定义了一个私有变量、设置器(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. EFI分区删除的有效方法

    用Diskpart命令,可以方便的删除EFI系统分区. 一,win + R, 输入cmd,回车. 二,输入 Diskpart ,回车,得到 三,再输入 list disk , 回车,查看磁盘信息 四, ...

  2. centos7.3 gitlab 安装配置

    1. 设备环境 硬件配置联想 TS250 E3-1225,16G内存,2X1 TB 软件CentOS-7-x86_64-DVD-1804.iso ,安装时选择桌面版 推荐配置参考:https://do ...

  3. Active MQ C++实现通讯记录

    Active MQ  C++实现通讯 背景知识: ActiveMQ是一个易于使用的消息中间件. 消息中间件 我们简单的介绍一下消息中间件,对它有一个基本认识就好,消息中间件(MOM:Message O ...

  4. 为什么我要放弃javaScript数据结构与算法(第九章)—— 图

    本章中,将学习另外一种非线性数据结构--图.这是学习的最后一种数据结构,后面将学习排序和搜索算法. 第九章 图 图的相关术语 图是网络结构的抽象模型.图是一组由边连接的节点(或顶点).学习图是重要的, ...

  5. BZOJ3293_分金币_KEY

    题目传送门 设x[i]表示i+1向i传的糖果数,x[n]表示1向n传的糖果数,a'=(a[1]+...a[N])/N a[1]+x[1]−x[n]=a' a[2]+x[2]−x[1]=a' a[3]+ ...

  6. java 中的线程池和线程 调用小demo

    public class Main { public static void main(String[] args) { try { /// ThreadPoolExecutor executor = ...

  7. 无偏方差为什么除以n-1

    设样本均值为,样本方差为,总体均值为,总体方差为,那么样本方差有如下公式:. 很多人可能都会有疑问,为什么要除以n-1,而不是n,但是翻阅资料,发现很多都是交代到,如果除以n,对样本方差的估计不是无偏 ...

  8. linux进程的学习笔记(未完)

    1. 进程是程序执行的一个实例,如果16个用户同时运行vi,那么有16个独立的进程,尽管它们共享同一个可执行代码,问题在于FreeRTOS这种系统,是否可以建2个相同的任务,需要注意什么?在linux ...

  9. possible new indexes 出现了

  10. 金山WPS面试题

    1.windows的handle 1)是一个宏定义#define void* HANDLE 2) HANDLE提供了一种统一的方式去获得系统资源,并对其进行操作. 3) HANDLE使得程序设计的细节 ...