Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/106.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 使用[NSString stringWithString:@“some string”与“@”的优缺点;“一些字符串”;_Objective C_Ios_Cocoa Touch_Cocoa_Nsstring - Fatal编程技术网

Objective c 使用[NSString stringWithString:@“some string”与“@”的优缺点;“一些字符串”;

Objective c 使用[NSString stringWithString:@“some string”与“@”的优缺点;“一些字符串”;,objective-c,ios,cocoa-touch,cocoa,nsstring,Objective C,Ios,Cocoa Touch,Cocoa,Nsstring,我想比较以下简单的作业: ... @property(nonatomic,retain) UITextField *textField; ... self.textField.text = @"some string"; self.textField.text = [NSString stringWithString:@"some string"]; self.textField.text = [NSString stringWithFormat:@"some string"]; 其中tex

我想比较以下简单的作业:

...
@property(nonatomic,retain) UITextField *textField;
...

self.textField.text = @"some string";
self.textField.text = [NSString stringWithString:@"some string"];
self.textField.text = [NSString stringWithFormat:@"some string"];
其中
textField
UITextField
text
属性a
NSString
。当然,它们都有用。当使用参数时,我知道最后两个的区别。但假设我们只对这种用法感兴趣

问题:

  • 做这种作业,为什么我不应该总是用第一个呢
  • 比较后两者,这两者的编译和/或运行时有什么不同吗?如果没有,我为什么要使用
    stringWithString:

  • 我认为第一个或第二个用于字符串并不重要。 但是我通常使用第二个

    对于第二个和第三个变量,如果您希望在字符串中包含另一个变量,则使用stringWithFormat one。否则,请使用stringWithString

    int number = 5;
    
    NSString *str = [NSString stringWithFormat:@"Number is: %i", number];
    
    // Str is "Number is: 5"
    
    使用stringWithString的情况:

    NSString *myName = [NSString stringWithString:@"FN LN"];
    
    // myName is "FN LN"
    
    当字符串中没有其他变量时,可以使用后者


    此外,这个问题在其他地方也得到了无数次的回答

    始终尝试做感觉自然的事情。如果要分配一个常量字符串,则执行该操作,即第一个选项
    @“…”
    字符串是非常有效的常量,不需要内存管理,因此如果有意义,请使用它们

    NSLog(@"%p", @"XX");
    NSLog(@"%p", @"XX");
    NSLog(@"%p", @"XX");
    
    结果:

    0xa2424
    0xa2424
    0xa2424
    
    0xa2424
    0xa2424
    0xa2424
    
    0x7f86730
    0xf8479b0
    0x8a4cdb0
    
    i、 它们在记忆中都是相同的对象

    NSLog(@"%p", [NSString stringWithString:@"XX"]);
    NSLog(@"%p", @"XX");
    NSLog(@"%p", [NSString stringWithString:@"XX"]);
    
    还导致:

    0xa2424
    0xa2424
    0xa2424
    
    0xa2424
    0xa2424
    0xa2424
    
    0x7f86730
    0xf8479b0
    0x8a4cdb0
    
    从中可以看出,这两个对象之间没有区别,因此使用
    -stringWithString:
    只是要发送的额外消息。话虽如此,开销通常不会大到足以产生影响,因此无论如何都不应该是什么大问题。就我个人而言,我会选择方法一,因为使用方法二没有任何好处,它只是额外的代码

    但是,

    NSLog(@"%p", [NSString stringWithFormat:@"XX"]);
    NSLog(@"%p", [NSString stringWithFormat:@"XX"]);
    NSLog(@"%p", [NSString stringWithFormat:@"XX"]);
    
    结果:

    0xa2424
    0xa2424
    0xa2424
    
    0xa2424
    0xa2424
    0xa2424
    
    0x7f86730
    0xf8479b0
    0x8a4cdb0
    
    正如您所看到的,每次都会创建一个新字符串,因为您提供的sting只是一个用于处理以下替换变量的格式字符串,因为您没有避免
    stringWithFormat:
    ,除非您需要它

    (显然,所有地址都是示例…)

    做这种作业,为什么我不应该总是用第一个呢

    在你描述的情况下,你应该始终使用第一个。第二种和第三种情况可能会复制常量字符串,但UITextField的
    text
    属性仍被指定为复制提供的字符串。仅仅为了让UITextField的
    -setText:
    可以复制一个常量字符串的副本是没有意义的

    比较后两者,编译有什么不同吗- 和/或这两者的运行时间?为什么我要使用stringWithString:at 如果没有呢

    我的理解是,
    -stringWithFormat:
    将始终创建一个新字符串,而对于常量字符串,
    -stringWithString:
    可能不会(可能不会)。在这方面,hypercrypt的上述结果非常有说服力;如果您想了解更多,可以使用可变字符串尝试相同的测试

    做这种作业,为什么我不应该总是用第一个呢

    对于这种任务,你总是使用第一个,而不是最后两个

    为什么我要使用stringWithString:如果不是的话

    你的直觉是正确的。在大多数情况下,
    -stringWithString:
    的值是可疑的。它主要用于
    NSMutableString
    ,它是
    NSString
    的一个子类

    例如:

    NSMutableString* myString = [NSMutableString stringWithString:@"Foo"];
    [myString appendString:@"Bar"];
    
    如果要将NSMutableString转换为NSString,或者确保正在处理NSString实例,也可以使用它。例如:

    - (void):setMyString:(NSString*)newString 
    {
        [_myString release];
        _myString = [[NSString stringWithString:newString] retain];
    }
    
    这是确保
    \u myString
    ivar指向NSString实例而不是NSMutableString实例的一种方法。只有在必要时才会复制
    newString
    实例


    然而,大多数开发人员只会使用
    \u myString=[newString copy]在这种情况下。

    textField
    对象的
    text
    属性的声明是什么?添加到问题中…对我来说,看起来像是一个家庭作业问题。这不是声明。请显示
    @属性…
    行。属性属性(例如
    text
    是否复制或保留新值)会产生影响。更重要的是,
    stringWithFormat:
    采用格式字符串,就像
    NSLog
    采用格式字符串一样。您不希望为其第一个参数传递任何不是特定格式字符串的字符串。