实时搜索: nsstring为什么用copy

nsstring为什么用copy

748条评论 1027人喜欢 5850次阅读 481人点赞
1. NSString *str1 = [NSString stringWithFormat: @"hello"];
NSString *str2 = [str1 copy];

NSLog(@"%lu\n", [str2 retainCount]);
copy不是新对象的引用计数为1吗?
结果为什么是2.

2.
B *b = [[B alloc] init];
NSLog(@"%lu\n", [b retainCount]);
...

object-c相关问题。: 1.我怀疑...这个NSString并没有实现copy协议,而是简单的retain了。
if(str1==str2){
NSLog(@"equal");
}
else{
NSLog(@"not equal");
}
那个楼主可以试一下。两者相等的,也就是说地址是指向一片内存的。当然,因为是retain的,引用计数器会加一,所以...
2.那个释放是有delay time的,具体参见NSInvocation,不过在iOS 5.0以后版本你这个代码就会崩了。

@property(nonatomic,copy)NSString*name 这段代码是什么意思: 是复制的一个关于财产的文件,*符号表示隐藏了的名字。
是一个财产文件的副本。

你好 。我想获取 IOS中的 imsi 。使用NSString * CTSIMSupportCopyMobileSubscriberIdentity();: 这个系统好像不让调用了吧,尽量不要用这些不常用的,以免上架的时候被否

ios 开发 nsstring为什么用copy修饰,而不是用strong修饰: 可以用啊,为啥不能用?还能用retain呢! 只是功能不同而已!!

NSString到底是用copy还是strong: NSString一般建议用copy,这样再更改数据不影响原来的赋值,
NSMutableString *mStr = [NSMutableStringstringWithFormat:@"abc"];
假如,mStr对象的地址为0x11,也就是0x11是@“abc”的首地址,mStr变量自身在内存中的地址为0x123;
当把mStr赋值给retain的rStr时,rStr对象的地址为0x11,rStr变量自身在内存中的地址为0x124;rStr与mStr指向同样的地址,他们指向的是同一个对象@“abc”,这个对象的地址为0x11,所以他们的值是一样的。
当把mStr赋值给copy的cStr时,cStr对象的地址为0x22,cStr变量自身在内存中的地址0x125;cStr与mStr指向的地址是不一样的,他们指向的是不同的对象,所以copy是深复制,一个新的对象,这个对象的地址为0x22,值为@“abc”。
如果现在改变mStr的值:
[mStr appendString:@"de"];
NSLog(@"retainStr:%@", _rStr);
NSLog(@"copyStr:%@", _cStr);

结果,
使用retain的字串rStr的值:@"abcde",
而使用copy的字串cStr的值:@"abc",
所以,如果一般情况下,我们都不希望字串的值跟着mStr变化,所以我们一般用copy来设置string的属性。
如果希望字串的值跟着赋值的字串的值变化,可以使用strong,retain。

iOS开发,高德地图定位后,怎么判断是否在中国大陆: CLGeocoder *geoCoder = [[CLGeocoder alloc]init];//ios version>6.0

[geoCoder reverseGeocodeLocation:newLocation completionHandler:^(NSArray *placemarks, NSError *error) {

}

geoCoder根据
(CLLocation *)newLocation
解析得到placemarks,里面包含了所有地址信息:
/*

CLPlacemark 属性

@property (nonatomic, readonly, copy) NSString *name; // eg. Apple Inc.

@property (nonatomic, readonly, copy) NSString *thoroughfare; // street address, eg. 1 Infinite Loop

@property (nonatomic, readonly, copy) NSString *subThoroughfare; // eg. 1

@property (nonatomic, readonly, copy) NSString *locality; // city, eg. Cupertino

@property (nonatomic, readonly, copy) NSString *subLocality; // neighborhood, common name, eg. Mission District

@property (nonatomic, readonly, copy) NSString *administrativeArea; // state, eg. CA

@property (nonatomic, readonly, copy) NSString *subAdministrativeArea; // county, eg. Santa Clara

@property (nonatomic, readonly, copy) NSString *postalCode; // zip code, eg. 95014

@property (nonatomic, readonly, copy) NSString *ISOcountryCode; // eg. US

@property (nonatomic, readonly, copy) NSString *country; // eg. United States

@property (nonatomic, readonly, copy) NSString *inlandWater; // eg. Lake Tahoe

@property (nonatomic, readonly, copy) NSString *ocean; // eg. Pacific Ocean

@property (nonatomic, readonly, copy) NSArray *areasOfInterest;

*/

/*CLPlacemark 具体内容注解的一个具体例子*/

/*

NSString *name = placemark.name;//高新区综合服务楼(深圳)

NSString *thoroughfare = placemark.thoroughfare;//高新南四道

NSString *subThoroughfare = placemark.subThoroughfare;//30北门

NSString *locality = placemark.locality;//深圳市

NSString *subLocality = placemark.subLocality;//南山区

NSString *administrativeArea = placemark.administrativeArea;//广东省

NSString *subAdministrativeArea = placemark.subAdministrativeArea;//nil

NSString *postalCode = placemark.postalCode;//nil

NSString *ISOcountryCode = placemark.ISOcountryCode;//CN

NSString *country = placemark.country;//中国

NSString *inlandWater = placemark.inlandWater;//nil

NSString *ocean = placemark.ocean;//nil

// NSArray *areasOfInterest = placemark.areasOfInterest;//nil

*/

NSString属性什么时候用copy,什么时候用strong: 我们在声明一个NSString属性时,对于其内存相关特性,通常有两种选择(基于ARC环境):strong与copy。那这两者有什么区别呢?什么时候该用strong,什么时候该用copy呢?让我们先来看个例子。

示例
我们定义一个类,并为其声明两个字符串属性,如下所示:

@interface TestStringClass ()
@property (nonatomic, strong) NSString *strongString;
@property (nonatomic, copy) NSString *copyedString;
@end

上面的代码声明了两个字符串属性,其中一个内存特性是strong,一个是copy。下面我们来看看它们的区别。
首先,我们用一个不可变字符串来为这两个属性赋值,

- (void)test {
NSString *string = [NSString stringWithFormat:@"abc"];
self.strongString = string;
self.copyedString = string;
NSLog(@"origin string: %p, %p", string, &string);
NSLog(@"strong string: %p, %p", _strongString, &_strongString);
NSLog(@"copy string: %p, %p", _copyedString, &_copyedString);
}

其输出结果是:

origin string: 0x7fe441592e20, 0x7fff57519a48
strong string: 0x7fe441592e20, 0x7fe44159e1f8
copy string: 0x7fe441592e20, 0x7fe44159e200


们要以看到,这种情况下,不管是strong还是copy属性的对象,其指向的地址都是同一个,即为string指向的地址。如果我们换作MRC环境,打
印string的引用计数的话,会看到其引用计数值是3,即strong操作和copy操作都使原字符串对象的引用计数值加了1。
接下来,我们把string由不可变改为可变对象,看看会是什么结果。即将下面这一句

NSString *string = [NSString stringWithFormat:@"abc"];

改成:

NSMutableString *string = [NSMutableString stringWithFormat:@"abc"];

其输出结果是:

origin string: 0x7ff5f2e33c90, 0x7fff59937a48
strong string: 0x7ff5f2e33c90, 0x7ff5f2e2aec8
copy string: 0x7ff5f2e2aee0, 0x7ff5f2e2aed0


以发现,此时copy属性字符串已不再指向string字符串对象,而是深拷贝了string字符串,并让_copyedString对象指向这个字符
串。在MRC环境下,打印两者的引用计数,可以看到string对象的引用计数是2,而_copyedString对象的引用计数是1。

时,我们如果去修改string字符串的话,可以看到:因为_strongString与string是指向同一对象,所以_strongString的
值也会跟随着改变(需要注意的是,此时_strongString的类型实际上是NSMutableString,而不是NSString);而
_copyedString是指向另一个对象的,所以并不会改变。
结论
由于NSMutableString是NSString的子类,所以一个NSString指针可以指向NSMutableString对象,让我们的strongString指针指向一个可变字符串是OK的。
而上面的例子可以看出,当源字符串是NSString时,由于字符串是不可变的,所以,不管是strong还是copy属性的对象,都是指向源对象,copy操作只是做了次浅拷贝。

源字符串是NSMutableString时,strong属性只是增加了源字符串的引用计数,而copy属性则是对源字符串做了次深拷贝,产生一个新的
对象,且copy属性对象指向这个新的对象。另外需要注意的是,这个copy属性对象的类型始终是NSString,而不是
NSMutableString,因此其是不可变的。
这里还有一个性能问题,即在源字符串是NSMutableString,strong是单纯的增加对象的引用计数,而copy操作是执行了一次深拷贝,所以性能上会有所差异。而如果源字符串是NSString时,则没有这个问题。
所以,在声明NSString属性时,到底是选择strong还是copy,可以根据实际情况来定。不过,一般我们将对象声明为NSString时,都不希望它改变,所以大多数情况下,我们建议用copy,以免因可变字符串的修改导致的一些非预期问题。

属性中的NSString类型为什么用copy修饰:

用copy修饰的区别,发生在用NSMutableString类型给NSString类型赋值时,为了防止赋值的属性内容被无意中修改,所以用copy修饰。

[objc] view plain copy

#import <Foundation/Foundation.h>  

@interface CopyStr : NSObject  

@property (nonatomic, copy) NSString *strCopy;  

@property (nonatomic, strong) NSString *strStrong;  

- (void)testStr;  

@end  

[objc] view plain copy

#import "CopyStr.h"  

@implementation CopyStr  

- (void)testStr  

{  

NSMutableString *mString = [NSMutableString string];  

[mString setString:@"original"];  

self.strCopy = mString;  

self.strStrong = mString;  

NSLog(@"strCopy = %@", self.strCopy); // strCopy = original  

NSLog(@"strStrong = %@", self.strStrong); // strCopy = original  

[mString setString:@"changed"];  

NSLog(@"strCopy = %@", self.strCopy); // strCopy = original  

NSLog(@"strStrong = %@", self.strStrong); // strCopy = changed  

}  

[objc] view plain copy

#import <Foundation/Foundation.h>  

#import "CopyStr.h"  

int main(int argc, const charchar * argv[]) {  

@autoreleasepool {  

CopyStr *str = [[CopyStr alloc] init];  

[str testStr];  

}  

return 0;  

}  

可以看出,当用NSMutableString类型mString的对象给NSString类型str的对象赋值时,在mString改变后,用copy修饰的NSString对象strCopy的值不变,而用strong修饰的NSString对象strStrong的值变化了。

  • 2016为什么是丙申年

    美码是4英码是3.5是多少码: 英制尺码4码就是美制尺码3.5码,也是中国尺码(4+18)=22码,是极小的码数了,恭喜你:喜添小宝宝! ...

    348条评论 2037人喜欢 3467次阅读 304人点赞
  • ppt自定义设置在哪里

    太田痣会跟着人长吗: ?太田痣常出现在患者的脸上,这样让患者不够自信。也给患者的美观带来严重的影响,因此好多爱美的人们打算去除掉太田痣。那么, ?下面武警北京总队第二医院帮你解答。 ? 太田痣是一种先天性的色素性斑痣,它一般是发生在眼睛四...

    240条评论 2156人喜欢 4174次阅读 559人点赞
  • 211 985是谁提出来的

    23.04和23.4个平方是一样的吗?: 不一样。两个正数不相等,故平方也不相等。但是23.40和23.4的平方一样的。23.40不等于23.04 ...

    440条评论 1658人喜欢 2346次阅读 457人点赞
  • pdf怎么解锁

    建筑面积105.70平方,套内面积82.65,分摊面积23.04,啥意思: 就是说,你买的房子,实际使用面积是82.65㎡,但是你要出105.70㎡的钱,多出的23.04㎡,是电梯,楼梯,走道等等公用面积,几家人家分摊费用 ...

    248条评论 1294人喜欢 3976次阅读 380人点赞
  • probit模型谁提出的

    31层楼房22层好不好: 三十一层的楼房,第二十二层挺好的, ...

    819条评论 3335人喜欢 3848次阅读 820人点赞

随机推荐榜单