ARC & MRC下string内存管理策略探究 

  

  前两天跟同事争论一个关于NSString执行copy操作以后是否会发生变化,两个人整了半天,最后写代码验证了一下,发现原来NSString操作没我们想的那么简单,下面就让我们一起看看NSString和NSMutableString在MRC下执行retain,copy,mutableCopy,以及ARC下不同的修饰__weak, __strong修饰赋值究竟发生了什么。

 

一、验证代码如下:

- (void)testStringAddress
{
    int a = 0;
    int b = 0;
    
    static int c = 0;
    
    NSString *str = @"Hello World";
    
#if __has_feature(objc_arc)
    __weak   NSString *weakStr = str;
    __strong NSString *strongStr = str;
#else
    NSString *retainStr = [str retain];
#endif
    
    NSString *copyStr = [str copy];
    NSMutableString *mutableCopyStr = [str mutableCopy];
    
    // 验证mutableCopy出来的是否是mutableString,如果不是执行此行会Crash
    [mutableCopyStr appendFormat:@".."];
    str = @"i'm changed";
    
    NSString *str2 = [NSString stringWithFormat:@"Hello world"];
    
#if __has_feature(objc_arc)
    __weak   NSString *weakStr2 = str2;
    __strong NSString *strongStr2 = str2;
#else
    NSString *retainStr2 = [str2 retain];
#endif
    
    NSString *copyStr2 = [str2 copy];
    NSString *copy2Str2 = [str2 copy];
    NSString *mutableCopyStr2 = [str2 mutableCopy];
    NSString *mutableCopy2Str2 = [str mutableCopy];
    str2 = [[NSString alloc] initWithFormat:@"changed"];
    
    NSMutableString *mutableStr = [NSMutableString stringWithString:@"hello world"];
    
#if __has_feature(objc_arc)
    __weak   NSMutableString *weakMutableStr = mutableStr;
    __strong NSMutableString *strongMutableStr = mutableStr;
#else
    NSMutableString *retainMutableStr = [mutableStr retain];
#endif
    
    NSMutableString *copyMutableStr = [mutableStr copy];
    NSMutableString *copy2MutableStr = [mutableStr copy];
    NSString *mutableCopyMutableStr = [mutableStr mutableCopy];
    NSString *mutableCopy2MutableStr = [mutableStr mutableCopy];
    [mutableStr appendFormat:@" apped something"];

#if __has_feature(objc_arc)
    NSLog(@"\r str: %@,\r weakStr: %@,\r strongStr: %@,\r copyStr: %@,\r mutableCopyStr: %@", str, weakStr, strongStr, copyStr, mutableCopyStr);
    NSLog(@"\r str2: %@,\r weakStr2: %@,\r strongStr: %@,\r copyStr2: %@,\r mutableCopyStr2: %@", str2, weakStr2, strongStr2, copyStr2, mutableCopyStr2);
    NSLog(@"\r mutableStr: %@,\r weakMutableStr: %@\r strongMutableStr: %@,\r copyMutableStr: %@,\r mutableCopyMutableStr: %@", mutableStr, weakMutableStr, strongMutableStr, copyMutableStr, mutableCopyMutableStr);
#else 
    NSLog(@"\r str: %@,\r retainStr: %@,\r copyStr: %@,\r mutableCopyStr: %@", str, retainStr, copyStr, mutableCopyStr);
    NSLog(@"\r str2: %@,\r retainStr2: %@,\r copyStr2: %@,\r mutableCopyStr2: %@", str2, retainStr2, copyStr2, mutableCopyStr2);
    NSLog(@"\r mutableStr: %@,\r retainMutableStr: %@,\r copyMutableStr: %@,\r mutableCopyMutableStr: %@", mutableStr, retainMutableStr, copyMutableStr, mutableCopyMutableStr);
#endif
}
testStringAddress

相关文章:

  • 2021-07-10
  • 2018-03-28
  • 2021-12-20
  • 2021-05-06
  • 2022-01-29
  • 2022-12-23
  • 2022-12-23
  • 2021-09-30
猜你喜欢
  • 2022-12-23
  • 2021-11-17
  • 2018-08-16
  • 2021-06-10
  • 2021-10-24
  • 2021-04-29
  • 2022-12-23
相关资源
相似解决方案