OC学习笔记之属性详解和易错点
属性的概念在OC1.0中就存在,格式是定义实例变量,然后定义setter和getter方法,用点操作符操作属性
举例,类的接口部分
@interface Father : NSObject
{
NSInteger _item;
}
#pragma mark - 属性
-(void)setItem:(NSInteger)item;
-(NSInteger)item; -(void)setAAA:(NSInteger)aaa;
-(NSInteger)AAA; @end
类的实现部分
#import "Father.h"
@implementation Father
-(void)setItem:(NSInteger)item{
_item = item;
}
-(NSInteger)item{
return _item;
}
-(void)setAAA:(NSInteger)aaa{
_item = aaa;
}
-(NSInteger)AAA{
return _item;
}
@end
main函数
Father *test = [[Father alloc]init];
test.item = ;
NSLog(@"%ld",test.item); test.AAA = ;
NSLog(@"%ld",test.AAA);
在上边的示例中定义了一个实例变量和两个属性,两个属性操作同一个实例变量,注意,属性和实例变量没有必然的联系,属性只是操作实例变量(甚至不操作实例变量,后面会详细解释),但是setter和getter方法的命名规则需要注意,setter方法的命名是set+属性名,getter的命名方法是属性名(属性AAA的setter方法是setAAA:,getter方法名是AAA)
OC2.0以后提供了@property和@synthesize关键字从语法层简化了属性的书写
属性的声明
#import <Foundation/Foundation.h> @interface Father : NSObject
{
NSInteger _item;
NSString *_str;
}
#pragma mark - 属性
@property NSInteger item;
@property NSString *AAA; @end
属性的实现
@implementation Father @synthesize item = _item,AAA = _str; @end
此时应注意,两个不同属性不能同时操作同一个实例变量,语法检查会报错。
Xcode5以后,属性实现部分的代码可以省略,Xcode会生成属性实现的代码(苹果官方推荐写法)
在这里需要注意的点有点多,一一分析。
在省略属性实现部分代码后,Xcode给出的默认的属性实现的代码是这样的
@synthesize 属性1 = _属性1,属性2 = _属性2;
也就是属性操作的实例变量时_+属性名,以上面属性声明代码为例,Xcode生成的代码是这样的
@synthesize item = _item,AAA = _AAA;
注意我们的类接口文件中只有_item,_AAA是没有的,这个变量是没有的,他是Xcode自动生成的真.私有实例变量,为什么加个真呢,因为这个变量不会生成在接口文件中,只会声明在类的实现文件中,而且是声明在类的最上端,大致是这样的
@implementation Father NSString *_AAA; @synthesize item = _item,AAA = _AAA; @end
因此Father作为父类时_AAA是不会像@private下的实例变量一样被继承的,所以不推荐大家在子类中声明和父类中相同名称的属性,尤其是没有相对应的实例变量的时候,理由大家可以考虑下。
最后简单介绍下属性的修饰词,一共有三类
读写性修饰词:readwrite(默认) readonly
原子性又叫线程安全修饰词:atomic(默认) nonatomic
语义性修饰词:assign retain copy
读写性修饰词就和字面意思一样可以控制属性的读写,默认是readwrite可读可写的当你设置成readonly时,此属性不可写,给属性写赋值语句的话编译会报错
线程安全性就是控制线程是不是安全的(废话么。。。)
在这开个传送门有兴趣的童鞋可以看下 http://www.cnblogs.com/zwq194/archive/2012/06/26/2563567.html
语义性修饰词其实就是内存控制
同样开个传送门 http://blog.csdn.net/hahahacff/article/details/39839571
OC学习笔记之属性详解和易错点的更多相关文章
- expect学习笔记及实例详解【转】
1. expect是基于tcl演变而来的,所以很多语法和tcl类似,基本的语法如下所示:1.1 首行加上/usr/bin/expect1.2 spawn: 后面加上需要执行的shell命令,比如说sp ...
- 2016 - 1- 14 UI阶段学习补充 transform属性详解
UIView的transform属性 transform是view的一个重要属性,它在矩阵层面上改变view的显⽰状态,能实现view的缩放.旋转.平移等功能.transform是CGAffineTr ...
- Struts2学习笔记(二)——配置详解
1.Struts2配置文件加载顺序: default.properties(默认常量配置) struts-default.xml(默认配置文件,主要配置bean和拦截器) struts-plugin. ...
- Struts2学习笔记二 配置详解
Struts2执行流程 1.简单执行流程,如下所示: 在浏览器输入请求地址,首先会被过滤器处理,然后查找主配置文件,然后根据地址栏中输入的/hello去每个package中查找为/hello的name ...
- Docker技术入门与实战 第二版-学习笔记-3-Dockerfile 指令详解
前面已经讲解了FROM.RUN指令,还提及了COPY.ADD,接下来学习其他的指令 5.Dockerfile 指令详解 1> COPY 复制文件 格式: COPY <源路径> .. ...
- vue.js学习笔记(二)——vue-router详解
vue-router详解 原文链接:www.jianshu.com 一.前言 要学习vue-router就要先知道这里的路由是什么?为什么我们不能像原来一样直接用<a></a> ...
- Redis学习笔记4-Redis配置详解
在Redis中直接启动redis-server服务时, 采用的是默认的配置文件.采用redis-server xxx.conf 这样的方式可以按照指定的配置文件来运行Redis服务.按照本Redi ...
- Android学习笔记之Activity详解
1 理解Activity Activity就是一个包含应用程序界面的窗口,是Android四大组件之一.一个应用程序可以包含零个或多个Activity.一个Activity的生命周期是指从屏幕上显示那 ...
- [C#] 类型学习笔记二:详解对象之间的比较
继上一篇对象类型后,这里我们一起探讨相等的判定. 相等判断有关的4个方法 CLR中,和相等有关系的方法有这么4种: (1) 最常见的 == 运算符 (2) Object的静态方法ReferenceEq ...
随机推荐
- HTTP长连接200万尝试及调优
对于一个server,我们一般考虑他所能支撑的qps,但有那么一种应用, 我们需要关注的是它能支撑的连接数个数,而并非qps,当然qps也是我们需要考虑的性能点之一.这种应用常见于消息推送系统,也称为 ...
- Android IOS WebRTC 音视频开发总结(二二)-- 多人视频架构模式
本文主要介绍多人视频会议服务端架构方式,文章来自博客园RTC.Blacker,转载必须说明出处,欢迎关注个人微信公众号blacker,更多详见www.rtc.help 随着移动互联网的迅速发展,很多公 ...
- slf4j+log4j配置
下载三个包: 三个包分别是:log4j的API包,slf4j的API包,slf4j对log4j的适配包. 选择使用slf4j一个重要的原因是支持占位符{},不用频繁操作字符串对象. 实现代码如下: i ...
- HTTP状态
HTTP状态码 当浏览者访问一个网页时,浏览者的浏览器会向网页所在服务器发出请求.当浏览器接收并显示网页前,此网页所在的服务器会返回一个包含HTTP状态码的信息头(server header)用以响应 ...
- linux下vi的复制,黏贴,删除,撤销,跳转等命令
前言 在嵌入式linux开发中,进行需要修改一下配置文件之类的,必须使用vi,因此,熟悉 vi 的一些基本操作,有助于提高工作效率. 一,模式vi编辑器有3种模式:命令模式.输入模式.末行模式 ...
- HTTP首部及各状态码
通用首部:客户端和服务器都可以使用的通用首部,比如Status Code: 请求首部:请求首部是请求报文特有的,它们为服务器提供了一些额外信息,例如Accept: */* 用来告知服务器客户端会接受与 ...
- Win7、win2008中让IIS7支持asp的方法
Win7或Windows server 2008中IIS7支持ASP+Access解决方法. 1. 让IIS7支持ASP Win7或Windows server 2008中IIS7是默认不安装的, ...
- mysql存储引擎(mysql学习六)
存储引擎 现在只有InnoDB支持外键 上接着学习笔记五 class表中有外键,所以不能修改存储引擎 表类型 默认的服务器表类型,通过my.ini可以配置 Default-storage-e ...
- shell脚本调用spark-sql
为了更方便的查询并产生报表, 需要使用shell脚本调用spark-sql spark/bin/spark-sql --master spark://host:7077 -f ${SQL_FILE} ...
- 十天学会单片机Day2键盘检测(独立键盘、矩阵键盘)
1.键盘的分类 编码键盘:键盘上闭合键的识别由专用的硬件编码器实现,并产生键编码号或键值的称为编码键盘,如计算机键盘 非编码键盘:靠软件编程来识别的称为非编码键盘.独立键盘.矩阵键盘 2.按键消抖 ...