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相关知识, ...
随机推荐
- 浅谈 JavaScript new 执行过程及function原理
前言 最近在学习JavaScript语言精粹,感觉写得相当不错.所以这里也算是总结一下.一个方法使用new的方式创建到底是怎样的过程,一个function的声明内部又是怎样执行的呢 另外学的过程中,不 ...
- Photoshop像素级画笔工具
1.直线工具 2.选择颜色,选择像素 dd
- 《DSP using MATLAB》示例 Example 6.5
代码: b = [1, 0, 0, 0, 16+1/16, 0, 0, 0, 1]; broots = roots(b) B1 = real(poly([broots(1), broots(2), b ...
- HTML form的一些属性(第一版)
p,li { white-space: pre-wrap } HTML表单属性总结(第一版) 基本格式为:<input type="类型" name="名字[唯一, ...
- myeclipse的一些优化设置
注:本文内容复制于little_paper的博客,具体链接为http://little-paper.iteye.com/blog/1670745,感谢little_paper的分享,为便于能随时学习, ...
- JDBC连接sql server数据库操作
1.首先,先创建一个连接数据库的工具类: package gu.db.util; import java.sql.Connection; import java.sql.DriverManager; ...
- 前端 TDD 开发
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 15.0px ".PingFang SC"; color: #454545 } p.p2 ...
- [Q]pdfFactory打印机内存不能为read的问题
运行环境:xp系统,AutoCAD2007 1. 使用pdfFactory打印文本文件没有问题. 2. 使用CAD打印的时候出现问题,使用CAD自带的PLOT命令打印也出现相同的问题. 3. 使用相同 ...
- nl2br()与nl2p()函数,php在字符串中的新行(\n)之前插入换行符
使用情景 很多场合我们只是简单用textarea获取用户的长篇输入,而没有用编辑器.用户输入的换行以“\n”的方式入库,输出的时候有时候会没有换行,一大片文字直接出来了.这个时候可以根据库里的“\n” ...
- MongoDB1: 环境安装
1. 环境准备,不支持XP系统,需要在Windows7及以上和windows server 2008 系统上安装. 2. 下载安装包:http://www.mongodb.org/downloads, ...