jos*_*hls 4 objective-c nsstring
我正在尝试将一个NSString值复制NSMutableArray到一个新变量中.NSString stringWithString返回一个NSString与我的数组中的对象相同的内存地址.为什么?
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[])
{
@autoreleasepool {
NSMutableArray *arr = [NSMutableArray arrayWithObject:@"first"];
NSLog(@"string is '%@' %p", [arr objectAtIndex:0], [arr objectAtIndex:0]);
// copy the string
NSString *copy = [NSString stringWithString:[arr objectAtIndex:0]];
NSLog(@"string is '%@' %p", copy, copy);
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
1)每当您使用@""语法创建字符串时,框架将自动缓存字符串.NSString是一个非常特殊的类,但框架将负责它.当您@"Some String"在应用程序的多个位置使用时,它们都将指向内存中的相同地址.只有当你使用类似的东西时-initWithData:encoding,字符串才会被缓存.
2)其他答案建议您应该使用-copy,但-copy只会在对象可变的情况下创建对象的副本.(如NSMutableString)
当您发送-copy到不可变对象(如NSString)时,它将与发送它-retain返回对象本身相同.
NSString *originalString = @"Some String";
NSString *copy = [originalString copy];
NSString *mutableCopy1 = [originalString mutableCopy];
NSString *mutableCopy2 = [mutableCopy copy];
NSString *anotherString = [[NSString alloc] initWithString:originalString];
Run Code Online (Sandbox Code Playgroud)
- > originalString,copy,mutableCopy2并且anotherString将全部指向同一个内存地址,只mutableCopy1点做存储不同的区域.
| 归档时间: |
|
| 查看次数: |
1779 次 |
| 最近记录: |