A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 liusuizuoyou 于 2015-7-28 18:47 编辑

Foundation  框架中   NSMutableString  是NSString 的子类  ,按说可以继承所有NSString 的方法 ,但小弟却发现啊  在  NSMutableString  的字符串下无法使用  NSString 中的替换方法。


#import <Foundation/Foundation.h>

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        NSMutableString *str=[NSMutableString stringWithFormat:@"1*2*3"];

        [str stringByReplacingOccurrencesOfString:@"*" withString:@"<-->"];
        //意图是  把 str 的两个 *  替换成 <-->
        NSLog(@"str=%@",str);
        //打印出来的结果为 :str=1*2*3
    }
    return 0;
}


求详解``??

13 个回复

倒序浏览
上面乱码了  不好意思  


  1. #import <Foundation/Foundation.h>

  2. int main(int argc, const char * argv[]) {
  3.     @autoreleasepool {
  4.         NSMutableString *str=[NSMutableString stringWithFormat:@"1*2*3"];

  5.         [str stringByReplacingOccurrencesOfString:@"*" withString:@"<-->"];
  6.         //意图是  把 str 的两个 *  替换成 <-->
  7.         NSLog(@"str=%@",str);
  8.         //打印出来的结果为 :str=1*2*3
  9.     }
  10.     return 0;
  11. }
复制代码
回复 使用道具 举报
在我的Xcode5.1上运行很顺利啊!你再重新建一个项目试试.
回复 使用道具 举报
lz465350 发表于 2015-7-27 11:06
在我的Xcode5.1上运行很顺利啊!你再重新建一个项目试试.

打印出来的结果应该为  
  1. str=1<-->2<-->3
复制代码

才对啊
回复 使用道具 举报
哥。你这个是个低级错误啊。
解释:
我们知道NSString定义的是一个不可变字符串,所以他的改变字符串的对象方法,并不是返回对象本身。而是一个NSString的返回值,需要用新的对象接受呀。
所以你的代码修改成:
  1. #import <Foundation/Foundation.h>

  2. int main(int argc, const char * argv[]) {
  3.     @autoreleasepool {
  4.         NSMutableString *str=[NSMutableString stringWithFormat:@"1*2*3"];

  5.        NSString *s = [str stringByReplacingOccurrencesOfString:@"*" withString:@"<-->"];
  6.         NSLog(@"s=%@",s);
  7.       
  8.     }
  9.     return 0;
  10. }
复制代码
回复 使用道具 举报
kk要来黑马 发表于 2015-7-27 13:40
哥。你这个是个低级错误啊。
解释:
我们知道NSString定义的是一个不可变字符串,所以他的改变字符串的对象 ...

问题就在于  我是用  NSMutableString  定义的字符串  他是可变的 所以我觉得 在替换的时候   不需要再重新定义一个NSString 的字符串来接收
回复 使用道具 举报
liusuizuoyou 发表于 2015-7-27 19:44
问题就在于  我是用  NSMutableString  定义的字符串  他是可变的 所以我觉得 在替换的时候   不需要再重 ...

要注意的是,那个方法并没有在NSMutableString中重写啊。再说了,还要注意多态的限制,子类指针不能指向父类指针
回复 使用道具 举报
hccgk 中级黑马 2015-7-27 21:16:32
8#
我也不太明白,看来只有实践看看了
回复 使用道具 举报
hccgk 中级黑马 2015-7-27 21:19:21
9#
实践证明,好像这个方法有个返回值
他不会改变之前的形参,所以你可以这样写也可以
  1.     @autoreleasepool {
  2.             NSMutableString *str=[NSMutableString stringWithFormat:@"1*2*3"];
  3.             
  4.            //[str stringByReplacingOccurrencesOfString:@"*" withString:@"<-->"];
  5.             NSLog(@"s=%@",[str stringByReplacingOccurrencesOfString:@"*" withString:@"<-->"]);
  6.             
  7.         }
复制代码
回复 使用道具 举报
好像很高级的样子,并不能懂
回复 使用道具 举报
  1. [str stringByReplacingOccurrencesOfString:@"*" withString:@"<-->"];
复制代码


以上这句话的执行过程大致是这样的: NSMutableString 类的对象 str想调用这个stringByReplacingOccurrencesOfString:withString:方法,但是发现NSMutableString 类中没有此方法,需要在其父类NSString中查找是否有该方法.

而NSString类中确实有该方法,就会被str对象调用.可是NSString类是不可变字符串类,调用此方法时一定会产生一个新的不可变字符串,因此,子类的对象str在调用父类的此方法时,也一定会产生一个新的不可变字符串.
回复 使用道具 举报
hccgk 发表于 2015-7-27 21:19
实践证明,好像这个方法有个返回值
他不会改变之前的形参,所以你可以这样写也可以
...

嗯  后来我看了一下  这个方法的返回值是 NSString 类型的   也就是说    需要再定义一个NSString 字符串来接受结果   你这样写也行  。。。
      谢啦。。。
回复 使用道具 举报
kk要来黑马 发表于 2015-7-27 20:56
要注意的是,那个方法并没有在NSMutableString中重写啊。再说了,还要注意多态的限制,子类指针不能指向父 ...

没那么复杂  只是子类调用了  父类的方法而已  这个方法有一个 NSSstring * l 类型的返回值       所以要仔定义一个NSString  来接收   

谢谢啦  懂了  !!
回复 使用道具 举报
lz465350 发表于 2015-7-27 22:20
以上这句话的执行过程大致是这样的: NSMutableString 类的对象 str想调用这个stringByReplacingOccurrenc ...

解释的很详细  谢谢  懂了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马