d.e*_*nis 2 cocoa cocoa-touch objective-c nsstring ios
我想比较以下简单的作业:
...
@property(nonatomic,retain) UITextField *textField;
...
self.textField.text = @"some string";
self.textField.text = [NSString stringWithString:@"some string"];
self.textField.text = [NSString stringWithFormat:@"some string"];
Run Code Online (Sandbox Code Playgroud)
textFielda UITextField和texta属性在哪里NSString?当然所有这些都有效.我知道使用参数时最后两个的区别.但是让我们说我们只对这种用法感兴趣.
问题:
stringWithString:如果没有,我为什么要使用呢?hyp*_*ypt 12
总是尽量做自然感觉.如果你要分配一个常量字符串,那么就这样做,即第一个选项.@"..."字符串是非常有效的常量,不需要进行内存管理,因此如果有意义则使用它们.
NSLog(@"%p", @"XX");
NSLog(@"%p", @"XX");
NSLog(@"%p", @"XX");
Run Code Online (Sandbox Code Playgroud)
结果是:
0xa2424
0xa2424
0xa2424
Run Code Online (Sandbox Code Playgroud)
即它们在记忆中都是相同的对象.
NSLog(@"%p", [NSString stringWithString:@"XX"]);
NSLog(@"%p", @"XX");
NSLog(@"%p", [NSString stringWithString:@"XX"]);
Run Code Online (Sandbox Code Playgroud)
还导致:
0xa2424
0xa2424
0xa2424
Run Code Online (Sandbox Code Playgroud)
从中可以看出,两个对象之间没有区别,因此使用-stringWithString:只是一个额外的消息要发送.话虽如此,开销通常不足以产生差异,所以无论如何都不应该是一个大问题.我个人会选择方法一,因为没有使用方法二的好处,它只是额外的代码.
然而,
NSLog(@"%p", [NSString stringWithFormat:@"XX"]);
NSLog(@"%p", [NSString stringWithFormat:@"XX"]);
NSLog(@"%p", [NSString stringWithFormat:@"XX"]);
Run Code Online (Sandbox Code Playgroud)
结果是:
0x7f86730
0xf8479b0
0x8a4cdb0
Run Code Online (Sandbox Code Playgroud)
如您所见,每次创建一个新字符串,因为您提供的sting只是一个格式字符串,用于处理以下替换变量,因为stringWithFormat:除非您需要它,否则无法避免.
(显然所有地址都是例子......)
为了做这种任务,我为什么不总是使用第一个?
对于那种任务,你总是使用第一个,而不是最后两个.
我为什么要使用stringWithString:如果不是的话?
你的直觉是正确的.在大多数情况下-stringWithString:,价值可疑.它主要用于与... NSMutableString的子类NSString.
例如:
NSMutableString* myString = [NSMutableString stringWithString:@"Foo"];
[myString appendString:@"Bar"];
Run Code Online (Sandbox Code Playgroud)
如果要将NSMutableString转换为NSString,或者确保您正在处理NSString实例,也可以使用它.例如:
- (void):setMyString:(NSString*)newString
{
[_myString release];
_myString = [[NSString stringWithString:newString] retain];
}
Run Code Online (Sandbox Code Playgroud)
这是确保_myStringivar指向NSString实例而不是NSMutableString实例的一种方法.并且newString仅在必要时复制实例.
但是,大多数开发人员只会_myString = [newString copy];在这种情况下使用.
| 归档时间: |
|
| 查看次数: |
1699 次 |
| 最近记录: |