黑马程序员技术交流社区

标题: 关于可变和不可变数组的操作 [打印本页]

作者: 2014571245    时间: 2014-5-8 19:36
标题: 关于可变和不可变数组的操作
本帖最后由 2014571245 于 2014-5-9 11:02 编辑
  1. #import <Foundation/Foundation.h>

  2. int main(int argc, const char * argv[])
  3. {
  4.     NSMutableString *new1 = [NSString stringWithFormat:@"12 , 34"];
  5.     NSMutableString *new2 = [new1 copy];
  6.     NSRange *rang = [new2 rangeOfString:@"34"];
  7.     NSMutableString *new = [new2 deleteCharactersInRange:rang];
  8.    
  9.     NSLog(@"%@",new);
  10.     return 0;
  11. }
复制代码


根据MJ老师的讲解,自己写的代码,试图将不可变数组内容拷贝一份到可变数组中,再对该数组进行删除操作,可是报错了,想问问这段代码合理吗?不合理的话应该怎么改?
作者: 兰闻天    时间: 2014-5-8 20:32
本帖最后由 兰闻天 于 2014-5-8 23:23 编辑

  1. #import <Foundation/Foundation.h>

  2. int main(int argc, const char * argv[])
  3. {
  4.     NSMutableString *new1 = [NSString stringWithFormat: @"12 , 34"]; // 这个最好前边的也是NSString
  5.     NSMutableString *new2 = [new1 copy];  // 这里不对,对不可变数组执行copy是浅复制,应该换成[new1 mutableCopy],然后你再试试
  6.     NSRange rang = [new2 rangeOfString: @ "34"];
  7.     NSMutableString *new = [new2 deleteCharactersInRange:rang];

  8.     NSLog(@"%@",new);
  9.     return 0;
  10. }
复制代码

作者: Er01c    时间: 2014-5-8 21:48
本帖最后由 Er01c 于 2014-5-8 21:51 编辑
  1.         // 只有一种情况是浅拷贝:不可变对象调用copy方法时
  2.         // 浅拷贝:指针拷贝,不会产生新的对象。源对象计数器+1。
  3.         NSString *string = [NSString stringWithFormat:@"12 , 34"];
  4.         // copy产生的是不可变副本,由于源对象本身就不可变,所以为了性能着想,copy会直接返回源对象本身
  5.         // 源对象计数器会+1
  6.         // 在浅拷贝情况下,copy其实就相当于retain
  7.         NSString *str = [string copy];
复制代码


作者: 脸皮猴    时间: 2014-5-8 22:34
NSRange *rang!!!??? NSRange是结构体啊!!!你是不是搞错了
作者: Jine    时间: 2014-5-8 23:03
这有什么错吗????
NSRange *rang = [new2 rangeOfString: @"34"];//这是为了的出字符34的位置和长度。


作者: 兰闻天    时间: 2014-5-8 23:24
Jine 发表于 2014-5-8 23:03
这有什么错吗????
NSRange *rang = [new2 rangeOfString: @"34"];//这是为了的出字符34的位置和长度。
...

NSRange rang 这个没有*
作者: 2014571245    时间: 2014-5-8 23:50
Jine 发表于 2014-5-8 23:03
这有什么错吗????
NSRange *rang = [new2 rangeOfString: @"34"];//这是为了的出字符34的位置和长度。
...

的确有错  应该是
  1. NSRange rang = [new2 rangeOfString:@"34"];
复制代码

哎  太大意了   我不应该加*
作者: Jine    时间: 2014-5-9 00:15
………………我晕:funk:躲墙角反省!
作者: 脸皮猴    时间: 2014-5-9 07:51
Jine 发表于 2014-5-9 00:15
………………我晕躲墙角反省!

面壁完了请我香蕉。哈哈。。{:3_47:}{:3_53:},注意,不是NS开头的都是类,
作者: 吉大人    时间: 2014-5-9 08:23
学习了,刚好我也碰到这个问题




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2