ios @property
参考资料
http://blog.csdn.net/pingchangtan367/article/details/14000315
http://blog.csdn.net/xdrt81y/article/details/9720121
首先 @property 是声明对象用的 看这个列子,
//in BaseClass.h
@interface BaseClass : NSObject{
@public
NSString *_name;
}
@property(nonatomic,copy) NSString *name;
//in BaseClass.m
@synthesize name = _name; @end BaseClass *base=[[BaseClass allow]init]; base.name(这样的花可以直接引用name) base._name(这样就是不能直接引用的)
@property起了一个修饰的作用 至于@property(....) 一系列的参数 就是对当前修饰对象的一个进一步内存上的修饰
1.atomic 和 nonatomic
atomic是默认的属性,表示对对象的操作属于原子操作,主要是在多线程的环境下,提供多线程访问的安全。我们知道在多线程的下对对象的访问都需要先上锁访问后再解锁,保证不会同时有几个操作针对同一个对象。如果编程中不涉及到多线程,不建议使用,因为使用atomic比nonatomic更耗费系统资源。
nonatomic 表示访问器的访问不是原子操作,不支持多线程访问安全,但是访问性能高。
2.readwrite 和readonly
readwrite 是默认的属性,表示可以对对象进行读和写,会生成对象相应的setter和getter方法。
readonly 表示只允许读取对象的值,只会生成对象的getter方法。
3.retain,assign和copy
retain 表示对NSObject和及其子类对象release旧值,再retain新值,使对象的应用计数增加一。
此属性只能使用于obejective-c类型对象,而不能用于Core Foundation对象。(retain会增加对象的引用计数,而基本数据类型或者Core Foundation对象都没有引用计数,把对象添加到数组中时,引用计数将增加1)。
- (void) setOldValue: (NSString*) newValue {
if (newValue !=oldValue) {
[oldValue release];
oldValue = [newValue retain];
}
}
assign 是默认属性,只可以对基本数据类型(如CGFloat,NSInteger,Bool,int,代理对象)等使用。该方式会对对象直接赋值而不会进行retain操作。
copy 表示重新建立一个新的计数为1的对象,然后释放掉旧的值。
都知道retain是对指针的拷贝,copy是对内容的拷贝。比如:NSString 对象的地址为0x100,其内容为“string”,如果使用copy到另外一个NSString对象,则会生成另外一个地址为0x110的对象,只不过内容仍然是‘string“。如果使用retain到另外一个NSString对象,则该对象的地址仍然为0x100,只不过该对象的计数变为2.
4.strong 和 weak
在ARC的模式下,对象声明时需要加入strong和weak,方便内存的自动管理。默认情况下是strong类型。
strong 强引用,默认的属性,类似于retain,其实是一个相对的概念,就是一个引用。如果有一个强引用持有该对象,则该对象就不能被释放。默认的所有实例变量和局部变量都是strong指针。
weak 弱引用,类似于assign,弱引用除了不决定对象的存亡外,其他与强引用相同。即使一个对象被持有无数个若引用,只要没有强引用指向他,那麽其还是会被清除,它不是对象的拥有者。其值会在对象被释放后自动设置为nil。
weak指针主要用于“父-子”关系,父亲拥有一个儿子的strong指针,因此父亲是儿子的所有者;但为了阻止所有权循环,儿子需要使用weak指针指向父亲。典型例子是delegate模式,你的ViewController通过strong指针(self.view)拥有一个UITableView, UITableView的dataSource和delegate都是weak指针,指向你的ViewController。
那么看看@property究竟干了什么??
还是上面的Demo;
@interface BaseClass : NSObject{
@public
NSString *_name;
}
//@property(nonatomic,copy) NSString *name; -(NSString*) name;
-(void) setName:(NSString*)newName;
@end 把@property的定义注释掉了,另外定义了两个函数,name和setName,下面请看实现文件: //@synthesize name = _name; -(NSString*) name{
return _name;
} -(void) setName:(NSString *)name{
if (_name != name) {
[_name release];
_name = [name copy];
}
} 现在,你再编译运行,一样工作的很好。why?因为我刚刚做的工作和先前声明@property所做的工作完全一样。@prperty只不过是给编译器看的一种指令,它可以编译之后为你生成相应的getter和setter方法。而且,注意看到面property(nonatomic,copy)括号里面这copy参数了吗?它所做的事就是_name = [name copy];或者上面一系列的参数
Property定义:@property 声明用于自动创建property属性变量的getter和setter
Synthesize定义:@Synthesize声明实现了property属性变量的getter和setter。
ios @property的更多相关文章
- 解决错误: ios property has a previous declaration
今天维护一个项目的时候,我新添加了一个库,运行的时候报错了: ios property has a previous declaration 上网查了一下没有找到思路,不过根据提示自己试了一下,原来这 ...
- iOS - property,strong,weak,retain,assign,copy,nomatic 的区别及使用
1:ARC环境下,strong代替retain.weak代替assign,xcode 4.2(ios sdk4.3和以下版本)和之前的版本使用的是retain和assign,是不支持ARC的.xcod ...
- iOS Property 关键字的使用
atomic和nonatomic用来决定编译器生成的getter和setter是否为原子操作. atomic 设置成员变量的@property属性时,默认为atomic,提供多线程安全 ...
- iOS property中的strong 、weak、copy 、assign 、retain 、unsafe_unretained 与autoreleasing区别和作用详解
iOS5中加入了新知识,就是ARC,其实我并不是很喜欢它,因为习惯了自己管理内存.但是学习还是很有必要的. 在iOS开发过程中,属性的定义往往与retain, assign, copy有关,我想大家都 ...
- iOS @property的默认属性
我是一个比较懒的人,很多情况下@property都不喜欢加属性…所以必须了解默认情况下哪些是已经有的,哪些在需要时是必须要加的. 原文链接:http://blog.sina.com.cn/s/blog ...
- iOS @property语句
@property声明的形式是: @property ( attributes ) type name; type和name的含义一目了然,attributes描述了如何编写访问器. 一.assign ...
- IOS @property的参数说明
1. @property的参数说明========================================ARC是苹果为了简化程序员对内存的管理,推出的一套内存管理机制使用ARC机制,对象的申 ...
- iOS @property、@synthesize和@dynamic
@property @property的本质: @property = ivar(实例变量) + getter/setter(存取方法); 在正规的 Objective-C 编码风格中,存取方法有着严 ...
- iOS runtime探究(三): 从runtime開始理解OC的属性property
你要知道的runtime都在这里 转载请注明出处 http://blog.csdn.net/u014205968/article/details/67639303 本文主要解说runtime相关知识, ...
随机推荐
- Android 关于ListView中按钮监听的优化问题(方法二)
关于ListView中按钮监听的优化问题(方法一)地址: http://www.cnblogs.com/steffen/p/3951901.html 之前的方法一,虽然能够解决position的传递, ...
- 初识ionic
1.Ionic环境安装 Ionic开发是依赖于Nodejs环境的,所以在开发之前我们需要安装好Nodejs.下载安装:http://nodejs.org/ 安装完成之后打开PowerShell输入命令 ...
- 《linux内核完全剖析》笔记03-进程创建
根据一下问题来看笔记 进程占多大的线形地址空间 进程实际分配多少物理内存 创建进程的开销在哪里 一. 从fork系统调用开始 kernel/sys_call.s第222行 _sys_fork: cal ...
- 游戏对象、组件和Prefabs
如标题所言,本文由3个部分组成,分别讲述游戏对象.组件和Prefabs(预设体). 1. 游戏对象 任何游戏对象都由组件组成,组件是实现一切功能所必需的.我们创建的对象会在Hierarchy视图中显示 ...
- sublime text3 用法
1. 使用lint进行语法及风格校验 jshint可以统一编码风格. 安装jshint的步骤: 1)ctrl+shift+p打开命令模式--->输入pcip回车--->输入sublimel ...
- Qt编译
版本及安装环境 项目 版本 位 Windows 7 x64 Visual Studio 2010 x64 qt 4.8.6 x64 下载源码 进入下载列表,下载qt-everywhere-openso ...
- LeetCode 476. Number Complement
Given a positive integer, output its complement number. The complement strategy is to flip the bits ...
- CentOS 手动增加、删除swap区
SWAP是Linux中的虚拟内存,用于扩充物理内存不足而用来存储临时数据存在的.它类似于Windows中的虚拟内存.在Windows中,只可以使用文件来当作虚拟内存.而linux可以文件或者分区来当作 ...
- 5754Life Winner Bo
给定一个n*m的矩阵,有四种棋子(国际象棋的王,王后,骑士,车).起点在(1,1)先走到(n,m)获胜. 分析:车是nim博弈.王后是威佐夫博弈.王和骑士写两个1000*1000的预处理即可. hdu ...
- Java中不定参的使用规则
Java中有时候会使用到不定参数,它的使用规则有2项: 一个方法中只能使用一个不定参数. 不定参数必须是方法中最后一个参数. 不定参数在传入的过程中会行成一个数组传入,如果不会放在最后一个,虚拟机无法 ...