解决方案 »

  1.   

    没看到changeStr2 方法。
    你用@""实例化的字符串实际是一个常量(不可修改的),编译器对此有优化,常量字符串都是共享的。
      

  2.   

    抱歉,写错了,changeStr2 就是这个my方法,我忘了改名
      

  3.   


    void changeStr(NSString **str2)
    {
        *str2 = [[NSString alloc] initWithFormat:@"%s", "changeStrchangeStrchangeStrchangeStr"];
    }
    void my(NSString *ss){
        
        NSLog(@"传入前的地址是%p -> %p -> %@",&ss,ss,ss);
        *(&ss) = [[NSString alloc] initWithFormat:@"%s", "mymymymymymymymy"];
        NSLog(@"%@", ss);
    }int main(int argc, const char * argv[]) {
        @autoreleasepool {
            
            NSString *str = [[NSString alloc] initWithFormat:@"%s", "456"];
            NSLog(@"before changeStr %@",str);
            changeStr(&str);
            NSLog(@"after changeStr %@",str);
            
            
            NSString *s = [[NSString alloc] initWithFormat:@"%s", "123"];
            NSLog(@"传入前的地址是%p -> %p -> %@",&s,s,s);
            my(s);
            NSLog(@"after my %@",s);
            
            
        }
        return 0;
    }
    OC对象的指针,跟C/C++的指针有比较大的差别的,如果非要在函数中处理字符串且通过参数返回改变后的值,建议使用char指针或数组做参数来处理。