字符串、深浅拷贝

字符串类型

NSString类,其对象内容不可变。对象化C语言的字符串,用@""表示字面常量。可以与基本数据类型进行转换。

创建字符串 常量:

NSString *str=@"This is a NSString Object";
创建一个空字符串:
NSString *str1=[[NSString alloc] init];
NSString *str2=[NSString string];

用格式化字符串创建一个字符串对象:

NSString *str=[[NSString alloc] initWithFormat:@"%d",3];
NSString *str=[NSString stringWithFormat:@"%f",1.23];

Tips:和C语言中的sprintf类似,都是通过格式化字符串拼装字符串

字符串的比较

比较两个字符串对象的类容是否相同

NSString *str1=@"abc";
NSString *str2=@"abc";
if([str1 isEqualToString: str2]){
           NSLog(@"相同");
}

比较两个字符串对象是否为同一个对象
<pre name="code" class="objc">NSString *str1=@"abc";
NSString *str2=@"abc";
if(str1==str2){
           NSLog(@"他们是同一个地址");
}

 
Tips:其本质就是指针变量的值的比较 

比较两字符串的大小:

NSString *str1=@"abc";
NSString *str2=@"abc";
NSComparisonResult result=[str1 compare:str2];
if(result == NSOrderedDescending){
           NSLog(@"str1 > str2");
}

字符串转换

大小写转换

NSString *str=@"Divein edu";     调用方法[str uppercaseString]; 将str全部变为大写字母,[str1lowercaseString];将str全部变为小写字母,

[str1 capitalizedString]);每个单词首字母大写。


把字符串转换成基本数据类型

int a=[str  intValue]; 其他都类似于转换成int值类型

把字符串转换为数组

NSString *str=@"2013.04.05.06";

NSArray *arr=[str componentsSeparatedByString:@"."];


取子串

NSString *str = @"www.diveinedu.com";

  //从开始位置截断到指定的index位置,不包含该index位置的字符
NSString *substr = [str substringToIndex:3];// @"www”

  //从指定的index位置开始,截取到字符串末尾,包括该index位置的字符 
NSString *substr1 = [str substringFromIndex:4];// @"diveinedu.com”

NSRange range  = {4,9};
  //从index为4开始,取9个字符长度, // @"diveinedu"
NSString *substr2 = [str substringWithRange:range]; 

字符串连接

 NSString *str  = @"http://";
 NSString *str1 = @"www.diveinedu.com";
 NSString *url  = [NSString stringWithFormat:@"%@%@", str, str1];
 NSString *url1 = [str stringByAppendingString:str1];
 NSString *url2 = [str stringByAppendingFormat:@"%@", str1];
  //以上url url1 url2 三个字符串的内容都是一样的.三种不同的拼接方式

字符串查找

NSString *url = @"www.diveinedu.com";
 NSRange r = [url rangeOfString:@"divein"];
 if(r.location != NSNotFound)
 {
    NSLog(@"报告,我找到divein了,他躲在%ld的位置", r.location);
 }

深浅拷贝

深浅拷贝前提是:是实现NSCopying或者NSMutableCopying协议。

浅拷贝只是复制对象本身,对象的属性和包含的对象不做复制。

深拷贝则对对象本身复制,同是对 对象的属性也进行复制。

深浅拷贝的本质区别是对象或者对象属性的内存地址是否一样,一样则为浅拷贝,不一样则为深拷贝。

Foundation框架支持复制的类,默认是浅拷贝。其中对Foundation中不可变的对象进行copy时作用相当于retain。

而如果是mutablecopy时,无论对象是否可变,副本是可变的,并且实现了真正意义上的copy。如果对可变对象进行copy,

副本对象是不可变的,同样是真正意义上的copy。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
拷贝和浅拷贝都是常见的复制数据的方式。 浅拷贝只会复制对象的第一层属性,如果对象属性值是一个引用类型,那么复制的是该引用类型的地址,也就是说,新对象和原对象的该引用类型的属性指向同一个内存地址。当原对象的该引用类型的属性值发生变化时,新对象也会受到影响,因为它们指向的地址是相同的。 深拷贝则会递归地复制对象及其所有嵌套的属性,直到所有属性都是基本类型或不可变类型时才停止。这样,新对象和原对象的所有属性都指向不同的内存地址,互不影响。 实现深拷贝的方式有很多,以下列举几种: 1. 使用JSON.parse和JSON.stringify方法:先将对象转为字符串,然后再将字符串转回对象,这样可以实现深拷贝,但是有一些限制,比如不能复制函数、正则表达式等特殊类型的数据。 ```javascript let newObj = JSON.parse(JSON.stringify(oldObj)); ``` 2. 使用递归函数:遍历对象的所有属性,如果属性值是对象,则递归调用该函数进行复制,这样可以实现完整的深拷贝。 ```javascript function deepClone(obj) { if (typeof obj !== 'object' || obj === null) { return obj; } let result = Array.isArray(obj) ? [] : {}; for (let key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { result[key] = deepClone(obj[key]); } } return result; } ``` 以上列举了常见的深拷贝和浅拷贝的方式,具体使用哪种方式取决于实际需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值