属性的概念在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学习笔记之属性详解和易错点的更多相关文章

  1. expect学习笔记及实例详解【转】

    1. expect是基于tcl演变而来的,所以很多语法和tcl类似,基本的语法如下所示:1.1 首行加上/usr/bin/expect1.2 spawn: 后面加上需要执行的shell命令,比如说sp ...

  2. 2016 - 1- 14 UI阶段学习补充 transform属性详解

    UIView的transform属性 transform是view的一个重要属性,它在矩阵层面上改变view的显⽰状态,能实现view的缩放.旋转.平移等功能.transform是CGAffineTr ...

  3. Struts2学习笔记(二)——配置详解

    1.Struts2配置文件加载顺序: default.properties(默认常量配置) struts-default.xml(默认配置文件,主要配置bean和拦截器) struts-plugin. ...

  4. Struts2学习笔记二 配置详解

    Struts2执行流程 1.简单执行流程,如下所示: 在浏览器输入请求地址,首先会被过滤器处理,然后查找主配置文件,然后根据地址栏中输入的/hello去每个package中查找为/hello的name ...

  5. Docker技术入门与实战 第二版-学习笔记-3-Dockerfile 指令详解

    前面已经讲解了FROM.RUN指令,还提及了COPY.ADD,接下来学习其他的指令 5.Dockerfile 指令详解 1> COPY 复制文件 格式: COPY  <源路径> .. ...

  6. vue.js学习笔记(二)——vue-router详解

    vue-router详解 原文链接:www.jianshu.com 一.前言 要学习vue-router就要先知道这里的路由是什么?为什么我们不能像原来一样直接用<a></a> ...

  7. Redis学习笔记4-Redis配置详解

    在Redis中直接启动redis-server服务时, 采用的是默认的配置文件.采用redis-server   xxx.conf 这样的方式可以按照指定的配置文件来运行Redis服务.按照本Redi ...

  8. Android学习笔记之Activity详解

    1 理解Activity Activity就是一个包含应用程序界面的窗口,是Android四大组件之一.一个应用程序可以包含零个或多个Activity.一个Activity的生命周期是指从屏幕上显示那 ...

  9. [C#] 类型学习笔记二:详解对象之间的比较

    继上一篇对象类型后,这里我们一起探讨相等的判定. 相等判断有关的4个方法 CLR中,和相等有关系的方法有这么4种: (1) 最常见的 == 运算符 (2) Object的静态方法ReferenceEq ...

随机推荐

  1. ASP.NET的SEO:基础知识

    本系列目录 首先谈一点我自己的体会,我还是希望能和大家分享: 当你读到一定数量的SEO资料后,你会发现,对同一个问题,众说纷纭,莫衷一是.这其实主要是因为以下一些原因造成的:1. 很多SEO技巧,是& ...

  2. Android knock code analysis

    My colleague she forgot the knock code and ask me for help. I know her phone is LG G3 D855 with Andr ...

  3. phalcon框架学习之router

    router定义 在DI中注册router的方法: $di->set('router', function(){ $router = new Phalcon\Mvc\Router(); $rou ...

  4. js冒泡事件之之之

    console.log("event.target="+event.target); console.log("event.target="+event.tar ...

  5. SQLServer中用户 'sa' 登录失败解决办法

    今天下午,很奇怪的网站突然就打不开了,报错如下: “/”应用程序中的服务器错误. 用户 'sa' 登录失败. 说明: 执行当前 Web 请求期间,出现未处理的异常.请检查堆栈跟踪信息,以了解有关该错误 ...

  6. 小菜的系统框架界面设计-灰姑娘到白雪公主的蜕变(工具条OutLookBar)

    灰姑娘本身也有自已的优点,但是却可能因为外貌不讨人喜欢,要变成白雪公主却需要有很多勇气和决心去改变自已: 有一颗善良的心 讨人喜爱的外貌   --蜕变-->  我这里讲的是一个工具条的蜕变过程, ...

  7. mariadb数据库备份学习笔记

    备份类型: 完全备份 部分备份:仅备份其中的一张表或多张表 增量备份:仅备份从上次完全备份或增量备份之后变化的数据部分 热备份:在线备份,读写操作不受影响 温备份:在线备份,读操作可继续进行,但写操作 ...

  8. Git客户端图文详解如何安装配置GitHub操作流程攻略

    收藏自 http://www.ihref.com/read-16377.html Git介绍 分布式 : Git版本控制系统是一个分布式的系统, 是用来保存工程源代码历史状态的命令行工具; 保存点 : ...

  9. 深入PHP empty(),isset(),is_null()

    PHP empty(),isset(),is_null()的实例测试.   有关 PHP编程 的 empty(),isset() 还有 is_null() 这三个函数的用法讨论得已经很多了,而且很多资 ...

  10. C++十进制转换为二进制

    题目内容:将十进制整数转换成二进制数. 输入描述:输入数据中含有不多于50个的整数n(-231<n<231). 输出描述:对于每个n,以11位的宽度右对齐输入n值,然后输出“-->” ...