自定义类属性设置及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 ...
随机推荐
- MVC Controller 基类 BaseController 中的 Request
今天修复mvc中的一个bug,需求是每个页面要获取当前URL链接中 host首是否正确,我把获取url的方法写到了Controller的基类BaseController(BaseController继 ...
- python学习第一天 -----2019年4月15日
第一周-第06章节-Python3.5-第一个python程序 #!/usr/bin/env python #-*- coding:utf-8 _*- """ @auth ...
- 【8086汇编-Day3】用debug做实验时的技巧与坑
Ⅰ· 无病呻吟 学一门语言,不动手实验是学不好的,在实验中不断遇坑然后解决,才有进益.所以写一下我在第一次汇编实验中的所思所想(王爽<汇编语言>第二章章末实验). Ⅱ · 实验内容 题解思 ...
- windows 设置tomcat为自动启动服务
1.下载免安装tomcat包,解压 2.配置环境变量: 点击新建,创建一个 变量名为:CATALINA_HOME 变量值为:tomcat解压文件的位置, 例如 F:\apache-tomcat ...
- C++三元操作符
c++的三元操作符形式: //条件表达式 ? 表达式1 : 表达式2; 语义:如果“条件表达式”为true,则整个表达式的值就是表达式1,忽略表达式2:如果“条件表达式”为false,则整个表达式的值 ...
- Java:当前线程运行完毕,再运行后续逻辑
一.问题描述 在程序设计中,可能存在这样的情景:主线程中存在一个子线程,子线程需要在执行完毕后为后续代码逻辑提供参数.但在代码执行时,子进程还没执行完毕,后续的代码已经开始执行了,这时候就会出现参数为 ...
- Java >>>运算符 和 >> 运算符
>>> 在java 表示有符号右移.什么意思呢?就是最高位符号位也会移动. 我们知道,>>表示有符号右移. -1>> 1 = -1 -1>>2 = ...
- ORB-SLAM(十二)优化
ORB-SLAM中优化使用g2o库,先复习一下g2o的用法,上类图 其中SparseOptimizer就是我们需要维护的优化求解器,他是一个优化图,也是一个超图(包含若干顶点和一元二元多元边),怎样定 ...
- 屏蔽Drupal中的“Notice: Undefined index”警告
原因:drupal默认使用E_ALL,即输出所有错误和警告.我们只需要修改错误显示级别即可. 方法: 1. 打开\sites\default\settings.php 追加一行 ini_set('er ...
- 创龙DSP6748开发板LED闪烁-第一篇
1. 首先看下DSP6748的GPIO寄存器的文档,先看下框图,有这个框图,一目了然,输入和输出很清楚 2. 看下寄存器部分,对应上面的图,问题在于,DSP6748有多少个GPIO?最多144个,下一 ...