ios OC 关键字 copy,strong,weak,assign的区别

一、先介绍 copy、strong、weak 的区别,如代码所示

@property(copy,nonatomic)NSMutableString*aCopyMStr;
@property(strong,nonatomic)NSMutableString*strongMStr;
@property(weak,nonatomic)NSMutableString*weakMStr;
@property(assign,nonatomic)NSMutableString*assignMStr; 

NSMutableString *mstrOrigin = [[NSMutableStringalloc] initWithString:@"mstrOriginValue"]; 

self.aCopyMStr= mstrOrigin;
self.strongMStr= mstrOrigin;
self.weakMStr= mstrOrigin;
NSLog(@"mstrOrigin输出:%p,%@\\n", mstrOrigin,mstrOrigin); NSLog(@"aCopyMStr输出:%p,%@\\n",_aCopyMStr,_aCopyMStr);
NSLog(@"strongMStr输出:%p,%@\\n",_strongMStr,_strongMStr);
NSLog(@"weakMStr输出:%p,%@\\n",_weakMStr,_weakMStr);
NSLog(@"引用计数%@",[mstrOriginvalueForKey:@"retainCount"]); //输出结果 

//2016-09-01 15:19:13.134 lbCopy[1205:87583] mstrOrigin输出:0x7892a5e0,mstrOriginValue
//2016-09-01 15:19:13.135 lbCopy[1205:87583] aCopyMStr输出:0x7893deb0,mstrOriginValue
//2016-09-01 15:19:13.135 lbCopy[1205:87583] strongMStr输出:0x7892a5e0,mstrOriginValue
//2016-09-01 15:19:13.135 lbCopy[1205:87583] weakMStr输出:0x7892a5e0,mstrOriginValue
//2016-09-01 15:19:13.135 lbCopy[1205:87583] 引用计数2

结论:

1、copy 和 strong 引用计数器加一,weak 引用计数器不加一。

2、strong 和 weak 的内存地址都指向 mstrOrigin,copy 为创建新的内存地址并复制内容,再指向 mstrOrigin。

二、修改 mstrOrigin 的值的时候,必然不会影响aCopyMStr,只会影响strongMStr和weakMStr

三、将 mstrOrigin 置为 nil,strong 和 weak 都为 nil,copy 不为 nil

四、assign

assign 引用计数器不加一,但是要为指向的置为空时,只是进行值释放。这就导致野指针存在,即当这块地址还没写上其他值前,能输出正常值,但一旦重新写上数据,该指针随时可能没有值,造成奔溃。

原文地址:https://www.cnblogs.com/shen5214444887/p/9050780.html

时间: 2024-12-14 14:09:48

ios OC 关键字 copy,strong,weak,assign的区别的相关文章

strong,weak,assign的区别

使用assign:对基础数据类型(NSInteger)和C数据类型(int,float,double,char等).使用copy:对NSString:使用retain(引起引用计数加1):对其他NSObject(实例对象)和其子类: 属性关系有两种主要类型:strong和weak,相当于非ARC环境里的retain和assign.只要存在一个强引用,对象就会一直存在,不会被销毁. Objective-C中一直存在循环引用的问题,但在实际应用中很少出现循环引用.对于过去那些使用assign属性的地

ios中strong, weak, assign, copy

copy 和 strong(retain) 区别 1. http://blog.csdn.net/itianyi/article/details/9018567 大部分的时候NSString的属性都是copy,那copy与strong的情况下到底有什么区别呢? 比如: @property (retain,nonatomic) NSString *rStr; @property (copy, nonatomic)   NSString *cStr; - (void)test: { NSMutabl

对于atomic nonatomic assign retain copy strong weak的简单理解

atomic和nonatomic用来决定编译器生成的getter和setter是否为原子操作 1)atomic 设置成员变量的@property属性时,atomic是默认值,提供多线程安全 在多线程环境下,原子操作是必要的,否则有可能引起错误的结果.加了atomic后setter函数会变成下面这样: {lock} if (property != newValue) { [property release]; property = [newValue retain]; } {unlock} 2)n

atomic nonatomic assign retain copy strong weak 介绍

atomic和nonatomic用来决定编译器生成的getter和setter是否为原子操作.         atomic 设置成员变量的@property属性时,默认为atomic,提供多线程安全. 在多线程环境下,原子操作是必要的,否则有可能引起错误的结果.加了atomic,setter函数会变成下面这样:                        {lock}                                if (property != newValue) {    

strong,weak,assign,copy,的用法和区别

stong和weak用来修饰指针的 strong强指针;\强引用,对象,ios5以前叫retain weak弱指针\若饮用,,UI控件,代理,iOS5以前叫weak copy:字符串,复制    深复制\浅复制 @property copy\weak\strong\assign\retain weak(assign):代理\UI控件*strong(retain):其他对象(除代理,UI控件\字符串以外的对象)copy :字符串assign:非对象类型(基本数据类型init\float\BOOL\

iOS--合理定义对象的引用类型strong/weak/assign/copy

在ios中一定要合理使用对象的引用类型: 最佳原则:在ios中任何一个对象只有一个强引用 使用weak的情况: 1.懒加载的方式需要使用weak修饰: 如@property(nonatmic,weak) IBOutlet UILabel *lbl; 备注:所谓的懒加载就是指控件通过IB拖到根视图中,再通过连线的方式与ViewController中的属性对应起来.此种方式就相当于self.view执行了addSubview()方法,即self.view对该控件做了强引用,那么在viewContro

assign,copy,strong,weak,nonatomic的具体理解

例子: NSString *houseOfMM = [[NSString alloc] initWithString:'MM的三室两厅']; 上面一段代码会执行以下两个动作:  1 在堆上分配一段内存用来存储@' MM的三室两厅 ' ,比如:内存地址为 0X1111  内容为 ' MM的三室两厅' ,  2 在栈上分配一段内存用来存储 houseForWife ,比如:地址为 0XAAAA  内容自然为 0X1111 下面分别看下(assign,retain,copy):  1.assign的情

assign,copy,strong,weak,nonatomic的理解

举个例子: NSString *houseOfMM = [[NSString alloc] initWithString:'MM的三室两厅']; 上面一段代码会执行以下两个动作:  1 在堆上分配一段内存用来存储@' MM的三室两厅 ' ,比如:内存地址为 0X1111  内容为 ' MM的三室两厅' ,  2 在栈上分配一段内存用来存储 houseForWife ,比如:地址为 0XAAAA  内容自然为 0X1111 下面分别看下(assign,retain,copy):  1.assign

iOS中属性 (nonatomic, copy, strong, weak)的使用 By hL

以下内容来自Stackflow的详解 1.Nonatomicnonatomic is used for multi threading purposes. If we have set the nonatomic attribute at the time of declaration, then any other thread wanting access to that object can access it and give results in respect to multi-th