测试代码:
#define MLog(_var) ({
NSString* name = @#_var;NSLog(@"%@: %@ -> %p -> %@ -> %d",name,[_var class],_var,_var,(int)[_var retainCount]);})
int main(int argc, const char * argv[]) {
@autoreleasepool {
// insert code here...
NSString* aStr = @"123";
MLog(aStr);
NSString* aMuC = [aStr mutableCopy];
MLog(aMuC);
NSString* aCop = [aStr copy];
MLog(aCop);
NSString* bStr = @"1234567890";
MLog(bStr);
NSString* bRet = [bStr retain];
MLog(bRet);
NSString* cStr = [NSString stringWithFormat:@"123456789"];
MLog(cStr);
NSString* cCop = [cStr copy];
MLog(cCop);
NSString* cRet = [cStr retain];
MLog(cRet);
NSString* dStr = [NSString stringWithFormat:@"1234567890"];
MLog(dStr);
/*stringWithFormat:生成的对象,如果长度在10以下,类型是NSTaggedPointerString;如果在10以上,类型是NSCFString*/
NSString* dCop = [dStr copy];
MLog(dCop);
NSString* dRet = [dStr retain];
MLog(dRet);
}
return 0;
}
运行结果:
可以看到有三个类型:NSCFConstantString
、NSTaggedPointerString
和NSCFString
。
NSCFConstantString
是以字面量方式生成的,retainCount
是-1,无论copy
或者retain
都不会变化retainCount
的。相当于指针指向一个常量地址。NSCFString
不属于常量对象,copy
和retain
会引起retainCount
变化。NSTaggedPointerString
是一种Tagged Pointer
指针,这种指针是苹果针对64位实现进行的内存使用优化。