自定义类属性设置及setter、getter方法的内部实现
属性是可以说是面向对象语言中封装的一个体现,在自定义类中设置属性就相当于定义了一个私有变量、设置器(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方法的内部实现的更多相关文章
- 自定义类在PropertyGrid上的展示方法
自定义类在PropertyGrid上的展示方法 零.引言 PropertyGrid用来显示某一对象的属性,但是并不是所有的属性都能编辑,基本数据类型(int, double等)和.Net一些封装的类型 ...
- .net使用自定义类属性
.net中可以使用Type.GetCustomAttributes获取类上的自定义属性,可以使用PropertyInfo.GetCustomAttributes获取属性信息上的自定义属性. 下面以定义 ...
- java 一般类属性设置常量 用以长久使用
java 一般类属性设置常量 用以长久使用 一直引用 例如 文件名
- Java反射获取对象VO的属性值(通过Getter方法)
有时候,需要动态获取对象的属性值. 比如,给你一个List,要你遍历这个List的对象的属性,而这个List里的对象并不固定.比如,这次User,下次可能是Company. e.g. 这次我需要做一个 ...
- 阶段3 1.Mybatis_05.使用Mybatis完成CRUD_8 Mybatis中的返回值深入-调整实体类属性解决增和改方法的报错
如果实体类和数据库表内的字段没有保持一致 修改了属性子弹. 重新生成getter和setter还有toString方法 测试类里面,相关set的方法就都会报错. 只需要修改为最新的set方法就可以了. ...
- java循环遍历类属性 get 和set值方法
//遍历sqspb类 成员为String类型 属性为空的全部替换为"/"Field[] fields = sqspb.getClass().getDeclaredFields(); ...
- html5的自定义data-*属性和jquery的data()方法的使用示例
人们总喜欢往HTML标签上添加自定义属性来存储和操作数据. 但这样做的问题是,你不知道将来会不会有其它脚本把你的自定义属性给重置掉,此外,你这样做也会导致html语法上不符合Html规范,以及一些其它 ...
- WPF中Image控件绑定到自定义类属性
首先我们定义一个Student类,有ID,Name,Photo(保存图片路径). using System; using System.Collections.Generic; using Syste ...
- setter getter 方法
MRC下setter.getter方法写法.重写dealloc方法 @interface People : NSObject @property (nonatomic,strong) NSString ...
随机推荐
- linux搭建的LNMP环境下的mysql授权远程连接
用phpstudy搭建的lnmp环境下mysql授权远程连接 简单高效 这是因为mysql 里的优先级不是所有人(提前检查防火墙是关闭状态)1.使用phpstudy安装的mysql没有放置到可以直接调 ...
- [STM32F4][关于看门狗的那些事]
STM32(stm32f4XX系列)看门狗的总结: 1. 具有两个看门狗外设(独立和窗口)均可用于检测并解决由软件错误导致的故障:当计数器达到给定的超时值时,触发一个中断(仅适用于窗口看门狗)或产生一 ...
- 利用Python Counter快速计算出现次数topN的元素
需要用Python写一段代码,给定一堆关键词,返回出现次数最多的n个关键字. 第一反应是采用一个dict,key存储关键词,value存储出现次数,如此一次遍历即可得出所有不同关键词的出现次数,而后排 ...
- Java Dictionary 类
Dictionary 类是一个抽象类,用来存储键/值对,作用和Map类相似. 给出键和值,你就可以将值存储在Dictionary对象中.一旦该值被存储,就可以通过它的键来获取它.所以和Map一样, D ...
- 2 进程multiprocessing [mʌltɪ'prəʊsesɪŋ] time模块
1.multiprocessing模块 multiprocessing模块就是跨平台版本的多进程模块. multiprocessing模块提供了一个Process类来代表一个进程对象, 2.Proce ...
- Qml-Dialog不能隐藏标题栏和按钮自定义
在项目中,需要弹出一个对话框来完成用户输入的功能,为了考虑界面的同一,这里需要将原生自带的标题栏隐藏掉,换成自己写的 按照widget的写法,可以使用QDialog,但是qml与之对应的Dialog我 ...
- katalon系列五:使用Katalon Studio手动编写WEB自动化脚本
上一篇主要讲了怎么录制脚本,这次我们看看怎么手动编写脚本,接下来就编写一个简单的用百度搜索的脚本. 1.我们先抓取页面上的元素,点击工具栏上的Spy Web按钮(地球上有个绿点),URL输入百度地址, ...
- Python列表操作大全(非常全)
Python列表操作大全(非常全!!!) 对于python列表的理解可以和C语言里面的数组进行比较性的记忆与对照,它们比较相似,对于python里面列表的定义可以直接用方括号里加所包含对象的方法,并且 ...
- 逆波兰表达式[栈 C 语言 实现]
逆波兰表达式 逆波兰表达式又叫做后缀表达式.在通常的表达式中,二元运算符总是置于与之相关的两个运算对象之间,这种表示法也称为中缀表示.波兰逻辑学家J.Lukasiewicz于1929年提出了另一种表示 ...
- HDU - 6441(费马大定理)
链接:HDU - 6441 题意:已知 n,a,求 b,c 使 a^n + b^n = c^n 成立. 题解:费马大定理 1.a^n + b^n = c^n,当 n > 2 时无解: 2. 当 ...