何时使用copy,strong,weak,assign关键字 定义属性
现在我们看看iOS5中新的关键字strong, weak, unsafe_unretained. 可以与以前的关键字对应学习strong与retain类似,weak与unsafe_unretained功能差不多(有点区别,等下会介绍,这两个新 关键字与assign类似)。在iOS5中用这些新的关键字,就可以不用手动管理内存了,从java等其它语言转过来的程序员非常受用。
strong关键字与retain关似,用了它,引用计数自动+1,用实例更能说明一切
- @property (nonatomic, strong) NSString *string1;
- @property (nonatomic, strong) NSString *string2;
有这样两个属性
- @synthesize string1;
- @synthesize string2;
猜一下下面代码将输出什么结果?
- self.string1 = @"String 1";
- [self.string2 = self.string1;
- [self.string1 = nil;
- [NSLog(@"String 2 = %@", self.string2);
结果是:String 2 = String 1
由于string2是strong定义的属性,所以引用计数+1,使得它们所指向的值都是@"String 1", 如果你对retain熟悉的话,这理解并不难。
接着我们来看weak关键字:
如果这样声明两个属性:
- @property (nonatomic, strong) NSString *string1;
- @property (nonatomic, weak) NSString *string2;
并定义
- @synthesize string1;
- @synthesize string2;
再来猜一下,下面输出是什么?
- self.string1 = [[NSString alloc] initWithUTF8String:"string 1"];
- elf.string2 = self.string1;
- self.string1 = nil;
- 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的呢,下面看实例。
如果这样声明两个属性:
并定义
- @property (nonatomic, strong) NSString *string1;
- @property (nonatomic, unsafe_unretained) NSString *string2;
再来猜一下,下面的代码会有什么结果?
- self.string1 = [[NSString alloc] initWithUTF8String:"string 1"];
- self.string2 = self.string1;
- self.string1 = nil;
- NSLog(@"String 2 = %@", self.string2);
请注意,在此我并没有叫你猜会有什么输出,因为根本不会有输出,你的程序会crash掉。 原因是什么,其实 就是野指针造成的,所以野指针是可怕的。为何会造成野指针呢?同于用unsafe_unretained声明的指针,由于 self.string1=nil已将内存释放掉了,但是string2并不知道已被释放了,所以是野指针。然后访问野指针的内存就造成crash. 所以尽量少用unsafe_unretained关键字。
1. strong :除NSString\block以外的OC对象
@property(nonatomic,strong) NSArray * array;
2. weak:各种UI控件(但不是绝对,也有控件要使用strong属性的)
@property (nonatomic,weak) UIButton * button;
3. assign:CGFloat,NSInteger等基本数据类型、枚举、结构体(非OC对象)
@property(nonatomic,assign) CGFloat float;
4. copy:
copy : 创建的是不可变副本(如NSString、NSArray、NSDictionary)
mutableCopy :创建的是可变副本(如NSMutableString、NSMutableArray、NSMutableDictionary)
@property(nonatomic,copy)NSString * string;
•@property内存管理策略的选择
•1.非ARC
• 1> copy : 只用于NSString\block
• 2> retain : 除NSString\block以外的OC对象
• 3> assign : 基本数据类型、枚举、结构体(非OC对象),当2个对象相互引用,一端用retain,一端用assign
•2.ARC
• 1> copy : 只用于NSString\block
• 2> strong : 除NSString\block以外的OC对象
• 3> weak : 当2个对象相互引用,一端用strong,一端用weak
• 4> assgin : 基本数据类型、枚举、结构体(非OC对象)
对象前面加上__strong或者__weak的作用到底是什么作用
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
- (void)viewDidLoad {<br><br> [super viewDidLoad];<br><br> TestView2 *testView2 = [[TestView2 alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 200.0f, 50.0f)];//TestView2是我自己创建的一个类,在它调用dealloc时会输出提示<br><br> __strong TestView2 *te3 = testView2;<br><br> NSLog(@"引用计数%d",[testView2 retainCount]);<br><br> [testView2 release];<br><br>}<br><br>输出:2014-10-24 19:42:09.772 ARCTest[5354:2236280] 引用计数1<br><br>2014-10-24 19:42:09.772 ARCTest[5354:2236280] testView2Dealloc |
如上,在变量_te3前面加上__strong并没有起到任何作用,testView2的引用计数依然是1,且当testView2进行release时候,类的dealloc方法就被调用,只需要一次release,说明在变量前加上__strong并不能起到强引用的作用,这与propety属性里面的strong关键字的作用不同。
另外,发现一个问题,为什么新建一个变量,连续release两次都没有问题(确定在release之前只是创建了而已,没有retain).
何时使用copy,strong,weak,assign关键字 定义属性的更多相关文章
- ios OC 关键字 copy,strong,weak,assign的区别
一.先介绍 copy.strong.weak 的区别,如代码所示 @property(copy,nonatomic)NSMutableString*aCopyMStr; @property(stron ...
- ios 内存管理与property copy strong weak assign
- (void)fun{ NSString* str = [[NSString alloc] initWithString:@"string"]; NSLog(@"% ...
- 对于atomic nonatomic assign retain copy strong weak的简单理解
atomic和nonatomic用来决定编译器生成的getter和setter是否为原子操作 1)atomic 设置成员变量的@property属性时,atomic是默认值,提供多线程安全 在多线程环 ...
- ios中strong, weak, assign, copy
copy 和 strong(retain) 区别 1. http://blog.csdn.net/itianyi/article/details/9018567 大部分的时候NSString的属性都是 ...
- assign,copy,strong,weak,nonatomic的理解
举个例子: NSString *houseOfMM = [[NSString alloc] initWithString:'MM的三室两厅']; 上面一段代码会执行以下两个动作: 1 在堆上分配一段 ...
- assign,copy,strong,weak,nonatomic的具体理解
例子: NSString *houseOfMM = [[NSString alloc] initWithString:'MM的三室两厅']; 上面一段代码会执行以下两个动作: 1 在堆上分配一段内存 ...
- @property中的copy.strong.weak总结
1.NSString类型的属性为什么用copy NSString类型的属性可以用strong修饰,但会造成一些问题,请看下面代码 #import "ViewController.h" ...
- iOS中属性 (nonatomic, copy, strong, weak)的使用 By hL
以下内容来自Stackflow的详解 1.Nonatomicnonatomic is used for multi threading purposes. If we have set the non ...
- ios copy/strong/weak..使用总结
总结 关于属性的这些选项的学习,做一下总结: 所有的属性,都尽可能使用nonatomic,以提高效率,除非真的有必要考虑线程安全. NSString:通常都使用copy,以得到新的内存分配,而不只是原 ...
随机推荐
- Java网络编程技术2
3. UDP数据报通信 UDP通信中,需要建立一个DatagramSocket,与Socket不同,它不存在“连接”的概念,取而代之的是一个数据报包——DatagramPacket.这个数据报包必须知 ...
- IIS7.5配置Asp.net项目出现HTTP 错误 404.17 - Not Found 请求的内容似乎是脚本,因而将无法由静态文件处理程序来处理。
近日在将一个Asp.net项目部署到IIS7.5上时却出现了HTTP 错误 404.17 - Not Found 请求的内容似乎是脚本,因而将无法由静态文件处理程序来处理. 因为IIS里面使用的都是默 ...
- Mongo读书笔记2 -- 数据类型
Mongo有多种类型的collection, 默认的是随着document 数目的增多自动增大; 还有一些collection被称为capped collection, 只能包含固定数目的docu ...
- Java list 分页(多种方式)
方式一:public static void fenye(List list,int pagesize){ int totalcount=list.size(); int pagecou ...
- (LeetCode 189)Rotate Array
Rotate an array of n elements to the right by k steps. For example, with n = 7 and k = 3, the array ...
- IE 之 应用小结
1. 导出收藏夹(IE11) 导出:打开浏览器, 文件(F) → 导入和导出(M)... → 导出到文件(E) → 指定导出内容 → 指定保存路径导入:打开浏览器,文件(F) → 导入和导出(M).. ...
- 【转】TCP/IP详解学习笔记(一)
TCP/IP详解学习笔记 这位仁兄写得太好了. http://blog.csdn.net/goodboy1881/category/204448.aspx TCP/IP详解学习笔记(13)-T ...
- 代理(Proxy)模式简介
一.代理(Proxy)模式简介 代理模式是结构型模式. 代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用. 代理对象要继承于抽象主题,并控制原对象的引用 二.简单例子 抽象主题类 ...
- jdbc防止sql注入-PreparedStatement
jdbc防止sql注入 jdbc防止sql注入-PreparedStatement public List getUserByName(String name,String password){ ...
- MVC下的DAO接口类和SERVICE接口类区别?
简单理解: DAO数据库访问对象 实现连接数据库 修改.添加等细节 service服务层 面向功能 把一个整个服务 细化 调用DAO其实service其中都是一些方法 去调用DAO 甚至方法名都和DA ...