`
lizhuang
  • 浏览: 904233 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

stringByReplacingOccurrencesOfString

 
阅读更多
今天写代码的时候,用stringByReplacingOccurrencesOfString后出现崩溃,代码如下:
    NSString * s = [[NSString alloc] initWithFormat:@"1s"];
    s = [s stringByReplacingOccurrencesOfString:@"s" withString:@"x"];
    NSLog(@"%@",s);
    [s release];
我当时就奇怪了,明明是alloc之后再release,到底哪里出错了?
于是猜测stringByReplacingOccurrencesOfString也许返回的是另外一个指针,也就是说指针s的值变了,不再指向它原来alloc的内存单元了。
实验代码如下:
    NSString * s = [[NSString alloc] initWithFormat:@"1s"];
    NSLog(@"%x",s);
    s = [s stringByReplacingOccurrencesOfString:@"s" withString:@"x"];
    NSLog(@"%x",s);
显示结果:
4e4b430
4e4bd40
两个地址真的不一样。然后前面的[s release];会出现崩溃,猜测返回的对象应该是autorelease的。下面三段实验代码:
第一段代码
    NSString *s = [[NSString alloc] initWithFormat:@"1s"];
    NSString *x = [s stringByReplacingOccurrencesOfString:@"s" withString:@"x"];
    NSLog(@"S:%@,%x,retainCount:%d",s,s,[s retainCount]);
    NSLog(@"X:%@,%x,retainCount:%d",x,x,[x retainCount]);
控制台打印结果:
    S:1s,4b42fc0,retainCount:1
    X:1x,4b42970,retainCount:1
由结果可以看到,s和x的retainCount都是1。下面加个autorelease,再看看效果。

第二段代码
    NSString *s = [[NSString alloc] initWithFormat:@"1s"];
    NSString *x = [[s stringByReplacingOccurrencesOfString:@"s" withString:@"x"] autorelease];
    NSLog(@"S:%@,%x,retainCount:%d",s,s,[s retainCount]);
    NSLog(@"X:%@,%x,retainCount:%d",x,x,[x retainCount]);
控制台打印结果会提示出错:
    error for object 0x4b5ab60: double free
结果显示释放了两次。

第三段代码
    NSString *s = [[NSString alloc] initWithFormat:@"1s"];
    NSString *x = [s stringByReplacingOccurrencesOfString:@"s" withString:@"x"];
    NSLog(@"S:%@,%x,retainCount:%d",s,s,[s retainCount]);
    NSLog(@"X:%@,%x,retainCount:%d",x,x,[x retainCount]);
    [x release];
运行后直接就崩溃了,设断点DeBug提示:Program received signal:  “EXC_BAD_ACCESS”,说明有对象提早释放了。

因此,由上面三段代码应该可以看出stringByReplacingOccurrencesOfString函数返回的新对象是autorelease的。
分享到:
评论

相关推荐

    OC-里的字符串

    但可以创建一个新的字符串,如使用`stringByAppendingString:`或`stringByReplacingOccurrencesOfString:withString:`方法。 六、字符串的比较 OC提供了多种比较字符串的方法: 1. `isEqualToString:`:检查两个...

    OC增删改查

    4. **修改**:`stringByReplacingOccurrencesOfString:withString:`方法用于替换字符串中的某个子串。`str4=[str stringByReplacingOccurrencesOfString:@"sdgg" withString:@""];`将所有"sdgg"替换为空字符串,得到...

    Object-C字符串

    NSString *replacedStr = [str stringByReplacingOccurrencesOfString:@"World" withString:@"Objective-C"]; NSLog(@"Replaced: %@", replacedStr); // 输出: Hello, Objective-C! ``` 5. **字符串分割**:使用...

    判断用户输入的银行卡号是否正确的方法(基于Luhn算法的格式校验)

    string = [string stringByReplacingOccurrencesOfString:@"-" withString:@""]; if ([string rangeOfCharacterFromSet:[characterSet invertedSet]].location != NSNotFound) { return NO; } text = [text ...

    NSString扩展类

    7. **去除空格和标点**:可能有`trimmingCharactersInSet:`用于去除首尾空白,或者`stringByReplacingOccurrencesOfString:withString:`去除特定字符。 8. **字符串加密解密**:如果扩展类涉及到安全,可能会包含MD...

    iphone 开发学习基础NSString

    = NSNotFound) { str = [str stringByReplacingOccurrencesOfString:@"World" withString:@"Universe" options:0 range:range]; }` 最后,遍历字符串可以使用`enumerateSubstringsInRange:options:usingBlock:`方法...

    iOS批量修改文件架下的文件名

    NSString *newFileName = [fileName stringByReplacingOccurrencesOfString:@"BC" withString:@"HK"]; NSString *newFilePath = [projectPath stringByAppendingPathComponent:newFileName]; NSError *error; ...

    IOS中如何将十六进制颜色的字符串转化为UIColor

    NSString *cleanString = [hexString stringByReplacingOccurrencesOfString:@"#" withString:@""]; if ([cleanString length] != 6) { return nil; } unsigned int red, green, blue; [[NSScanner ...

    iPhone之NSString常用方法示例程序

    NSString *newStr = [original stringByReplacingOccurrencesOfString:@"Replace" withString:@"Don't"]; ``` 4. 分割字符串:`componentsSeparatedByString:`根据指定的分隔符将字符串拆分成数组。例如: ```objc ...

    NSString+ReplaceUnicode

    NSString *unescapedUnicodeStr = [unicodeStr stringByReplacingOccurrencesOfString:@"\\u" withString:@"\\U00"]; unescapedUnicodeStr = [unescapedUnicodeStr uppercaseString]; unescapedUnicodeStr = ...

    判断字符串是否是空

    5. **替换子字符串**:`stringByReplacingOccurrencesOfString:withString:`可以替换所有匹配的子字符串。 6. **格式化字符串**:`stringWithFormat:`允许使用类似于C语言的`printf`函数来动态创建字符串。 7. **...

    IOS常用文档

    return [(NSString *)string stringByReplacingOccurrencesOfString:@"-" withString:@""]; } ``` #### 功能描述 此方法用于生成一个随机的字符串(nonce),通常用于安全通信中的身份验证或会话管理。它通过生成一...

    iphone开发常用代码

    return [(NSString *)string stringByReplacingOccurrencesOfString:@"-" withString:@""]; } ``` 此函数通过创建一个UUID并移除其中的连字符“-”来生成Nonce值。UUID是一种保证全球唯一性的标识符,非常适合用于...

    【无限互联】iOS开发视频教程课件第四章Foundation框架课件

    NSString *newStr = [str stringByReplacingOccurrencesOfString:@"Hello" withString:@"Hi"]; NSLog(@"New string: %@", newStr); NSString *concatStr = [str stringByAppendingString:@" again!"]; NSLog(@...

    iOS验证手机号的正则表达式

    mobile = [mobile stringByReplacingOccurrencesOfString:@ withString:@]; if (mobile.length != 11) { return NO; }else{ /** * 移动号段正则表达式 */ NSString *CM_NUM = @^((13[4-9])|(14

    ios利用正则表达式判断手机号码格式是否正确的实例

    mobile = [mobile stringByReplacingOccurrencesOfString:@ withString:@]; if (mobile.length != 11) { return NO; }else{ /** * 移动号段正则表达式 */ NSString *CM_NUM = @^((13[4-9])|(147)|(15[0-2,7...

    Objective-C实现身份证验证的方法示例

    前言 最近在一个二次开发的项目中看到了一段身份证验证的OC代码,虽然我一直讨厌... value = [value stringByReplacingOccurrencesOfString:@X withString:@x]; value = [value stringByTrimmingCharactersInSet:[NSC

    IOS json 解析遇到错误问题解决办法

    responseString = [responseString stringByReplacingOccurrencesOfString:@"\r\n" withString:@""]; responseString = [responseString stringByReplacingOccurrencesOfString:@"\n" withString:@""]; ...

Global site tag (gtag.js) - Google Analytics