nsstring strong什么时候用copy,什么时候用strong

NSString什么时候用copy,什么时候用strong_百度知道
NSString什么时候用copy,什么时候用strong
提问者采纳
一个新的对象,都需要在最后的时候做处理,结果都是一样的;;  NSLog(@&quot,%p&quot,那么使用copy还是,这样源头改变的时候;mStr,%p&quot。  其实说白了;retainStr,nonatomic) NSString *rStr:%@&quot,  使用retain的字串rStr的值,rStr变量自身在内存中的地址为0x124,比如声明的一个NSString *str变量,
_cStr);rStr与mStr指向同样的地址;;  NSLog(@&copyStr,那么就用copyStr。  另外说明一下,这个对象的地址为0x22,值为@“abc”:@&abcde&quot,%p&quot, &_cStr),它也会跟着改变,如果希望属性变量不跟着变化;;  }  假如,mStr变量自身在内存中的地址为0x123,我们都不希望字串的值跟着mStr变化,所以我们一般用copy来设置string的属性,也就是说其实二者都是指针引用;  @property (copy,如果要求str跟着mStr变化,他们指向的是不同的对象;  NSLog(@&quot,也就是0x11是@“abc”的首地址,
mS?  比如;cStr与mStr指向的地址是不一样的,  所以。  把一个对象赋值给一个属性变量;abc&quot。  当把mStr赋值给copy的cStr时, _rStr。  由此可以看出:@&quot,都会增加内存引用计数,然后把一个NSMutableString *mStr变量的赋值给它了,这个对象的地址为0x11,如果一般情况下:@&quot:  {  NSMutableString *mStr = [NSMutableStringstringWithF  self。  如果希望字串的值跟着赋值的字串的值变化。  对源头是NSString的字符串,也就是浅拷贝:%p,它实际上是深拷贝:  [mStr appendString,
_cStr。  如果现在改变mStr的值,de&quot,cStr变量自身在内存中的地址0x125。而对于要把NSString类型的字符串赋值给str,如果是赋值是NSString对象:  @property (  self  大部分的时候NSString的属性都是copy:@&quot,当第二次源头的字符串重新指向其它的地方的时候.cStr
= mStr,所以他们的值是一样的,才会有不同,cStr对象的地址为0x22,因为NSString对象根本就不能改变自身的值;.rStr
= mStr,无论是retain声明的变量还是copy声明的变量,他是不可变的:%p;而copy声明的变量;],retain仅仅是指针引用,
_rStr),它不会跟着源头改变,如果希望属性变量变化就使用strong属性,对字符串为啥要用这两种方式:%p:上面的情况是针对于当把NSMutableString赋值给NSString的时候,所以copy是深复制,这两者对内存计数的影响都是一样的,用这种retain方式声明的变量(无论被赋值的变量是可变的还是不可变的),它还是指向原来的最初的那个位置,那就用  - (void)test,那copy与strong的情况下到底有什么区别呢,  而使用copy的字串cStr的值,mStr对象的地址为0x11,&mStr);retainStr。不会影响安全性,rStr对象的地址为0x11:%@&quot,当这个对象变化了, nonatomic)
NSString *cStr,内存管理也一样;  当把mStr赋值给retain的rStr时;  NSLog(@&quot, &_rStr)。  注意,那两都没啥区别;如果str不能跟着mStr一起变化,他们指向的是同一个对象@“abc”:  对源头是NSMutableString的字符串?我觉得还是一个安全问题;  结果;],可以使用abc&quot,增加了引用计数器;  NSLog(@&quot,就是用copy属性;
来自团队:
其他类似问题
为您推荐:
copy的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁NSString什么时候用copy,什么时候用strong_百度知道
NSString什么时候用copy,什么时候用strong
也就是0x11是@“abc”的首地址,这样再更改数据不影响原来的赋值;]:@&abc&quot.,mStr变量自身在内存中的地址为0x123, NSMutableString *mStr = [NSMutableStringstringWithFormat.,mStr对象的地址为0x11:NSString一般建议用copy; 当把mStr赋值; 假如答
其他类似问题
为您推荐:
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁NSString什么时候用copy,什么时候用strong_百度知道
NSString什么时候用copy,什么时候用strong
提问者采纳
nonatomic)
NSString *cS
NSLog(@&quot,都需要在最后的时候做处理,然后把一个NSMutableString *mStr变量的赋值给它了大部分的时候NSString的属性都是copy。注意,如果一般情况下;retainStr:@&],内存管理也一样,才会有不同,如果要求str跟着mStr变化,因为NSString对象根本就不能改变自身的值,当第二次源头的字符串重新指向其它的地方的时候。当把mStr赋值给copy的cStr时:%p;当把mStr赋值给retain的rStr时,增加了引用计数器。把一个对象赋值给一个属性变量:%p:@&quot:@&quot,无论是retain声明的变量还是copy声明的变量;abcde&
self,如果希望属性变量变化就使用strong属性,那两都没啥区别,rStr变量自身在内存中的地址为0x124;}假如;];;,所以copy是深复制,它实际上是深拷贝:%@&quot,
_rStr),也就是浅拷贝;而copy声明的变量,可以使用strong:对源头是NSMutableString的字符串,所以我们一般用copy来设置string的属性。其实说白了, &_rStr);de&quot:@&quot,结果都是一样的;@property (copy。不会影响安全性;
= mStr,它还是指向原来的最初的那个位置;retainStr,mStr变量自身在内存中的地址为0x123,retain仅仅是指针引用。如果希望字串的值跟着赋值的字串的值变化,比如声明的一个NSString *str变量,用这种retain方式声明的变量(无论被赋值的变量是可变的还是不可变的),它也会跟着改变,当这个对象变化了,他是不可变的,%p&quot.cStr
= mStr,他们指向的是不同的对象,都会增加内存引用计数:%@&quot,也就是说其实二者都是指针引用?我觉得还是一个安全问题,
_cSmStr, _rS
NSLog(@&quot。而对于要把NSString类型的字符串赋值给str。对源头是NSString的字符串,所以,rStr对象的地址为0x11;
NSLog(@"cStr与mStr指向的地址是不一样的:%p;,值为@“abc”;,这两者对内存计数的影响都是一样的。如果现在改变mStr的值;abc&quot,那copy与strong的情况下到底有什么区别呢,如果是赋值是NSString对象,
_cStr);rStr与mStr指向同样的地址,那么就用retain,retain, &_cStr);copyStr,他们指向的是同一个对象@“abc”,mStr对象的地址为0x11,这个对象的地址为0x22:{
NSMutableString *mStr = [NSMutableStringstringWithF,我们都不希望字串的值跟着mStr变化,所以他们的值是一样的,%p&;abc&quot,这个对象的地址为0x11:
[mStr appendS
NSLog(@&,而使用copy的字串cStr的值,就是用copy属性,对字符串为啥要用这两种方式;copyStr,如果希望属性变量不跟着变化,一个新的对象,使用retain的字串rStr的值:上面的情况是针对于当把NSMutableString赋值给NSString的时候,%p&quot,也就是0x11是@“abc”的首地址;
NSLog(@&quot,
mStr。另外说明一下;如果str不能跟着mStr一起变化,cStr对象的地址为0x22?比如;结果。由此可以看出,&mStr);- (void)test,那就用copy:@property (retain,nonatomic) NSString *rStr,cStr变量自身在内存中的地址0x125,这样源头改变的时候,它不会跟着源头改变,那么使用copy还是strong
来自团队:
其他类似问题
为您推荐:
copy的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁NSString什么时候用copy,什么时候用strong_百度知道
NSString什么时候用copy,什么时候用strong
我有更好的答案
大部分的时候NSString的属性都是copy,那copy与strong的情况下到底有什么区别呢?
@property (retain,nonatomic) NSString *rS
@property (copy, nonatomic)
NSString *cS
- (void)test:
NSMutableString *mStr = [NSMutableStringstringWithFormat:@&abc&];
NSLog(@&mStr:%p,%p&,
mStr,&mStr);
NSLog(@&retainStr:%p,%p&, _rStr, &_rStr);
NSLog(@&copyStr:%p,%p&,
_cStr, &_cStr);
假如,mStr对象的地址为0x11,也就是0x11是@“abc”的首地址,mStr变量自身在内存中的地址为0x123;
当把mStr赋值给retain的rStr时,rStr对象的地址为0x11,rStr变量自身在内存中的地址为0x124;rStr与mStr指向...
NSString一般建议用copy,这样再更改数据不影响原来的赋值, NSMutableString *mStr = [NSMutableStringstringWithFormat:@&abc&]; 假如,mStr对象的地址为0x11,也就是0x11是@“abc”的首地址,mStr变量自身在内存中的地址为0x123; 当把mStr赋值...
其他类似问题
为您推荐:
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁iOS5中加入了新知识,就是ARC,其实我并不是很喜欢它,因为习惯了自己管理内存。但是学习还是很有必要的。
在iOS开发过程中,属性的定义往往与retain, assign, copy有关,我想大家都很熟悉了,在此我也不介绍,网上有很多相关文章。
现在我们看看iOS5中新的关键字strong, weak, unsafe_unretained.
可以与以前的关键字对应学习strong与retain类似,weak与unsafe_unretained功能差不多(有点区别,等下会介绍,这两个新
关键字与assign类似)。在iOS5中用这些新的关键字,就可以不用手动管理内存了,从java等其它语言转过来的程序员非常受用。
strong关键字与retain关似,用了它,引用计数自动+1,用实例更能说明一切
有这样两个属性,
猜一下下面代码将输出什么结果?
结果是:String 2 = String 1
由于string2是strong定义的属性,所以引用计数+1,使得它们所指向的值都是@"String 1", 如果你对retain熟悉的话,这理解并不难。
接着我们来看weak关键字:
如果这样声明两个属性:
再来猜一下,下面输出是什么?
结果是: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的呢,下面看实例。
如果这样声明两个属性:
再来猜一下,下面的代码会有什么结果?
请注意,在此我并没有叫你猜会有什么输出,因为根本不会有输出,你的程序会crash掉。
原因是什么,其实就是野指针造成的,所以野指针是可怕的。为何会造成野指针呢?同于用unsafe_unretained声明的指针,由于
self.string1=nil已将内存释放掉了,但是string2并不知道已被释放了,所以是野指针。然后访问野指针的内存就造成crash.
&所以尽量少用unsafe_unretained关键字。
strong,weak,&unsafe_unretained往往都是用来声明属性的,如果想声明临时变量就得用__strong, &__weak, __unsafe_unretained, &__autoreleasing, 其用法与上面介绍的类似。
还是看看实例吧。
再看一个:
__autoreleasing的用法介绍:
在c/c++,objective-c内存管理中有一条是:谁分配谁释放。&__autoreleasing则可以使对像延迟释放。比如你想传一个未初始
化地对像引用到一个方法当中,在此方法中实始化此对像,那么这种情况将是__autoreleasing表演的时候。看个示例:
这样即便在函数内部申请的空间,在函数外部也可以使用,同样也适合谁分配谁释放的原则。
同样下面的代码也是类似原因, 只不过在没有开启ARC的情况下适用:
开启ARC后,应改为:
Setter Semantics
These attributes specify the semantics of a set accessor. They are mutually exclusive.
Specifies that there is a strong (owning) relationship to the destination object.
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.)
Specifies that a copy of the object should be used for assignment.
The previous value is sent a&&message.
The copy is made by invoking the&&method. This attribute is valid only for object types, which must implement the&NSCopying&.
Specifies that the setter uses simple assignment. This attribute is the default.
You use this attribute for scalar types such as&NSInteger&and&CGRect.
Specifies that&&should be invoked on the object upon assignment.
The previous value is sent a&&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 myD
&/article/661.html
阅读(...) 评论()

我要回帖

更多关于 ios copy strong 的文章

 

随机推荐