转载自:http://www.cnblogs.com/langtianya/p/3691035.html

iOS5中加入了新知识,就是ARC,其实我并不是很喜欢它,因为习惯了自己管理内存。但是学习还是很有必要的。

在iOS开发过程中,属性的定义往往与retain, assign, copy有关,我想大家都很熟悉了,在此我也不介绍,网上有很多相关文章。

现在我们看看iOS5中新的关键字strong, weak, unsafe_unretained. 可以与以前的关键字对应学习strong与retain类似,weak与unsafe_unretained功能差不多(有点区别,等下会介绍,这两个新 关键字与assign类似)。在iOS5中用这些新的关键字,就可以不用手动管理内存了,从java等其它语言转过来的程序员非常受用。

strong关键字与retain关似,用了它,引用计数自动+1,用实例更能说明一切

  1. @property (nonatomic, strong) NSString *string1;
  2. @property (nonatomic, strong) NSString *string2;

有这样两个属性,

  1. @synthesize string1;
  2. @synthesize string2;

猜一下下面代码将输出什么结果?

  1. self.string1 = @"String 1";
  2. self.string2 = self.string1;
  3. self.string1 = nil;
  4. NSLog(@"String 2 = %@", self.string2);

结果是:String 2 = String 1

由于string2是strong定义的属性,所以引用计数+1,使得它们所指向的值都是@"String 1", 如果你对retain熟悉的话,这理解并不难。

接着我们来看weak关键字:

如果这样声明两个属性:

  1. @property (nonatomic, strong) NSString *string1;
  2. @property (nonatomic, weak) NSString *string2;

并定义

  1. @synthesize string1;
  2. @synthesize string2;

再来猜一下,下面输出是什么?

  1. self.string1 = @"String 1";
  2. self.string2 = self.string1;
  3. self.string1 = nil;
  4. NSLog(@"String 2 = %@", self.string2);

结果是:String 2 = null

分析一下,由于self.string1与self.string2指向同一地址,且string2没有retain内存地址,而 self.string1=nil释放了内存,所以string1为nil。声明为weak的指针,指针指向的地址一旦被释放,这些指针都将被赋值为 nil。这样的好处能有效的防止野指针。在c/c++开发过程中,为何大牛都说指针的空间释放了后,都要将指针赋为NULL. 在这儿用weak关键字帮我们做了这一步。

接着我们来看unsafe_unretained

从名字可以看出,unretained且unsafe,由于是unretained所以与weak有点类似,但是它是unsafe的,什么是unsafe的呢,下面看实例。

如果这样声明两个属性:

并定义

  1. @property (nonatomic, strong) NSString *string1;
  2. @property (nonatomic, unsafe_unretained) NSString *string2;

再来猜一下,下面的代码会有什么结果?

  1. self.string1 = @"String 1";
  2. self.string2 = self.string1;
  3. self.string1 = nil;
  4. NSLog(@"String 2 = %@", self.string2);

请注意,在此我并没有叫你猜会有什么输出,因为根本不会有输出,你的程序会crash掉。

原因是什么,其实就是野指针造成的,所以野指针是可怕的。为何会造成野指针呢?同于用unsafe_unretained声明的指针,由于 self.string1=nil已将内存释放掉了,但是string2并不知道已被释放了,所以是野指针。然后访问野指针的内存就造成crash.  所以尽量少用unsafe_unretained关键字。

strong,weak, unsafe_unretained往往都是用来声明属性的,如果想声明临时变量就得用__strong,  __weak, __unsafe_unretained,  __autoreleasing, 其用法与上面介绍的类似。

还是看看实例吧。

  1. __strong NSString *yourString = @"Your String";
  2. __weak  NSString *myString = yourString;
  3. yourString = nil;
  4. __unsafe_unretained NSString *theirString = myString;
  5. //现在所有的指针都为nil

再看一个:

  1. __strong NSString *yourString = @"Your String";
  2. __weak  NSString *myString = yourString;
  3. __unsafe_unretained NSString *theirString = myString;
  4. yourString = nil;
  5. //现在yourString与myString的指针都为nil,而theirString不为nil,但是是野指针。

__autoreleasing的用法介绍:

在c/c++,objective-c内存管理中有一条是:谁分配谁释放。 __autoreleasing则可以使对像延迟释放。比如你想传一个未初始 化地对像引用到一个方法当中,在此方法中实始化此对像,那么这种情况将是__autoreleasing表演的时候。看个示例:

  1. - (void) generateErrorInVariable:(__autoreleasing NSError **)paramError{
  2. NSArray *objects = [[NSArray alloc] initWithObjects:@"A simple error", nil];
  3. NSArray *keys = [[NSArray alloc] initWithObjects:NSLocalizedDescriptionKey, nil];
  4. NSDictionary *errorDictionary = [[NSDictionary alloc] initWithObjects:objects forKeys:keys];
  5. *paramError = [[NSError alloc] initWithDomain:@"MyApp" code:1 userInfo:errorDictionary];
  6. }
  7. -(void)test
  8. {
  9. NSError *error = nil;
  10. [self generateErrorInVariable:&error];
  11. NSLog(@"Error = %@", error);
  12. }

这样即便在函数内部申请的空间,在函数外部也可以使用,同样也适合谁分配谁释放的原则。

同样下面的代码也是类似原因, 只不过在没有开启ARC的情况下适用:

  1. -(NSString *)stringTest
  2. {
  3. NSString *retStr = [NSString stringWithString:@"test"];
  4. return [[retStr retain] autorelease];
  5. }

开启ARC后,应改为:

  1. -(NSString *)stringTest
  2. {
  3. __autoreleasing NSString *retStr = [NSString alloc] initWithString:@"test"];
  4. return retStr;
  5. }
Setter Semantics

These attributes specify the semantics of a set accessor. They are mutually exclusive.

strong

Specifies that there is a strong (owning) relationship to the destination object.

weak

Specifies that there is a weak (non-owning) relationship to the destination object.

If the destination object is deallocated, the property value is automatically set to nil.

(Weak properties are not supported on OS X v10.6 and iOS 4; use assigninstead.)

copy

Specifies that a copy of the object should be used for assignment.

The previous value is sent a release message.

The copy is made by invoking the copy method. This attribute is valid only for object types, which must implement the NSCopying protocol.

assign

Specifies that the setter uses simple assignment. This attribute is the default.

You use this attribute for scalar types such as NSInteger and CGRect.

retain

Specifies that retain should be invoked on the object upon assignment.

The previous value is sent a release message.

In OS X v10.6 and later, you can use the __attribute__ keyword to specify that a Core Foundation property should be treated like an Objective-C object for memory management:

@property(retain) __attribute__((NSObject)) CFDictionaryRef myDictionary;

property中的strong 、weak、copy 、assign 、retain 、unsafe_unretained 与autoreleasing区别和作用详解...相关推荐

  1. linux中ctrl加c命令什么意思,Linux命令中Ctrl+z、Ctrl+c和Ctrl+d的区别和使用详解

    Ctrl+c,Ctrl+d,Ctrl+z在Linux中意义 Ctrl+c和ctrl+z都是中断命令,但是他们的作用却不一样. Ctrl+c是强制中断程序的执行. Ctrl+z的是将任务中断,但是此任务 ...

  2. 关于@property()的那些属性及ARC简介【nonatomic,atomic,assign,retain,strong,weak,copy。】

    @property()常用的属性有:nonatomic,atomic,assign,retain,strong,weak,copy. 其中atomic和nonatomic用来决定编译器生成的gette ...

  3. iOS weak和assign修饰OC对象的区别

    /*1.weak1> OC对象2.assign1> 基本数据类型2> OC对象3.strong1> OC对象4.copy1> NSString2> block5.使 ...

  4. VMware虚拟机文件夹中各文件作用详解

    VMware虚拟机文件夹中各文件作用详解 虚拟机的文件管理由VMware Workstation来执行. 一个虚拟机一般以一系列文件的形式储存在宿主机中, 这些文件一般在由workstation为虚拟 ...

  5. python中文意思k-对python中的*args与**kwgs的含义与作用详解

    在定义函数的时候参数通常会使用 *args与**kwgs,形参与实参的区别不再赘述,我们来解释一下这两个的作用. *args是非关键字参数,用于元组,**kw是关键字参数 例如下面的代码 def fo ...

  6. 正则表达式中模式修正符作用详解(i、g、m、s、x、e)

    正则表达式中常用的模式修正符有i.g.m.s.x.e等.它们之间可以组合搭配使用. 它们的作用如下: //修正符:i 不区分大小写的匹配; //如:"/abc/i"可以与abc或a ...

  7. 计算机曝光模式有哪些,摄影:单反相机中P、A、S、M四种曝光模式的用法详解 -电脑资料...

    这篇教程是向脚本之家的朋友介绍单反相机中P.A.S.M四种曝光模式的用法,对于摄影爱好者非常值得学习,推荐到脚本之家,喜欢的朋友一起来看看吧 很多朋友在初接触单反相机时对相机的P.A.S.M四种曝光模 ...

  8. 台式win7f1到f12热键取消_Windows 7旗舰版系统中键盘F1到F12快捷键的作用详解

    Windows 7旗舰版系统中键盘F1到F12快捷键的作用详解跟大家分享,在键盘上面大家都知道最上面有一排F1到F2的按键,这些是windows的功能键,可以提供我们一些通常的快捷操作,如果你掌握了这 ...

  9. python中import re_Python3中正则模块re.compile、re.match及re.search函数用法详解

    本文实例讲述了Python3中正则模块re.compile.re.match及re.search函数用法.分享给大家供大家参考,具体如下: re模块 re.compile.re.match. re.s ...

  10. python什么意思k_对python中的*args与**kwgs的含义与作用详解

    对python中的*args与**kwgs的含义与作用详解 在定义函数的时候参数通常会使用 *args与**kwgs,形参与实参的区别不再赘述,我们来解释一下这两个的作用. *args是非关键字参数, ...

最新文章

  1. 10冰点还原安装不了_荣耀智慧屏X1性能有多强?荣耀智慧屏X1怎么安装第三方软件?...
  2. html表单全选框,form表单里如何实现全选和全不选
  3. python爬百度翻译-python爬虫实现百度翻译
  4. 将Excel的数据导入DataGridView中(转)
  5. linux查看文件和文件夹大小
  6. VS 2012 找回消失的“创建单元测试”
  7. Java笔记07-List、Set、数据结构、Collections
  8. 花书+吴恩达深度学习(二五)直面配分函数(CD, SML, SM, RM, NCE)
  9. 中原消费金融借了就借不了吗?
  10. 【已解决】显示屏没有问题,主机电源键按不开机怎么办?
  11. 【免费毕设】PHP教材管理系统(源代码+论文)
  12. 《Linux Shell脚本攻略》读书笔记第二章 命令之乐
  13. Flume或Kafka和Elasticsearch整合
  14. CC2630 7x7 更改为5X5
  15. 如何做好线上活动策划及执行的思路与框架
  16. Greenplum的系统表
  17. 神舟GX8的强冷模式,其他神船伙伴也可以试一试
  18. 腾讯SkillNet|NLU任务全能网络,对Pathways架构的初步尝试
  19. python类中包含一个特殊的变量、它可以访问类的成员_区域联防的运用中遵循并贯彻以球为主的防守原则,做到球人区三者兼顾。( )...
  20. 2D转换图片放大实用场景(11)

热门文章

  1. python鼠标键盘事件代码_Python+selenium鼠标、键盘事件
  2. 学科实践活动感悟50字_连江县高中综合实践活动学科马春晖名师工作室开展送教送培活动...
  3. 2022 github新建账号技巧
  4. 使用代码把一个目录打包成jar
  5. 文字处理技术:WORD也在不断变化中
  6. 全网首发:Freeswitch会议房间增加标识
  7. 下载时,要关闭休眠功能
  8. 现实世界与虚拟世界的差别在哪里
  9. 13防更新描述文件_描述文件终于来了,iOS 13 也能屏蔽更新!
  10. java调用python脚本文件_Java实现调用jython执行python文件的方法