【问题标题】:Should I use an intermediate temp variable when appending to an NSString?附加到 NSString 时应该使用中间临时变量吗?
【发布时间】:2009-11-24 17:27:43
【问题描述】:

这行得通——它确实可以编译——但我​​只是想检查一下它是否被认为是好的做法或应该避免的事情?

NSString *fileName = @"image";
fileName = [fileName stringByAppendingString:@".png"];
NSLog(@"TEST  : %@", fileName);

OUTPUT: TEST  : image.png

使用临时变量可能会更好:

NSString *fileName = @"image";
NSString *tempName;
tempName = [fileName stringByAppendingString:@".png"];
NSLog(@"TEST  : %@", tempName);

只是好奇。

【问题讨论】:

  • 我知道它并没有真正附加,因为它创建了一个新对象,只是想检查一下,尽管我猜它只是为了可读性和首选样式。
  • 如果您正在为 iPhone 编程,则没有自动垃圾收集,因此您的第一个 fileName 实例可能会被泄露。可能最好使用第二个示例,然后在完成后显式释放 fileName。
  • @Rudism - 第一个实例是字符串文字,所以不需要释放
  • 这与您的问题无关,但请注意您也可以使用 stringByAppendingPathExtension:@"png"
  • 您绝对应该使用stringByAppendingPathExtension: 附加扩展名......

标签: objective-c cocoa coding-style


【解决方案1】:

在内部,编译器通常会将您的代码分解为一种称为“单一静态赋值”的表示形式,其中给定变量只分配一个值,并且所有语句都尽可能简单(复合元素被分成不同的行)。您的第二个示例遵循这种方法。

程序员有时会这样写。它被认为是最清晰的代码编写方式,因为您可以将所有语句编写为基本元组:A = B 运算符 C。但对于“显而易见”的代码,它通常被认为过于冗长,因此它是一种不常见的风格(在某些情况下)您试图使非常神秘的代码易于理解)。

一般来说,程序员不会对您的第一个示例感到困惑,并且在您不再需要原始fileName 的情况下,它被认为是可以接受的。然而,许多 Obj-C 程序员,鼓励以下风格:

NSString *fileName = [@"image" stringByAppendingString:@".png"];
NSLog(@"TEST  : %@", fileName);

甚至(取决于行上的水平空间):

NSLog(@"TEST  : %@", [@"image" stringByAppendingString:@".png"]);

即如果你只使用一次变量,不要命名它(只是在适当的地方使用它)。

不过,在风格上,如果您遵循单一静态分配方法,则不应使用 tempName 作为变量名,因为它不能解释变量的作用——您应该使用一些东西喜欢fileNameWithExtension。在更广泛的意义上,我通常避免使用“temp”作为前缀,因为将所有内容命名为“temp”太容易了(所有局部变量都是临时的,因此没有什么意义)。

【讨论】:

    【解决方案2】:

    第一行是声明一个 NSString 字面量。它具有持续整个进程生命周期的存储空间,因此不需要释放。

    对 stringByAppendingString 的调用返回一个自动释放的 NSString。这也不应该被释放,但会持续到它到达下一个自动释放池耗尽。 因此,将 stringByAppendingString 调用的结果分配回 fileName 指针是非常好的在这种情况下。但是,通常,您应该检查对象的生命周期,并相应地处理它们(例如,如果 fileName 已被声明为您拥有内存的字符串,则需要释放它,因此需要使用 temp ) .

    要检查的另一件事是,在这个 sn-p 之后,您是否对 fileName 做了任何事情 - 例如。在实例变量中保留它 - 在这种情况下,您需要保留它。

    【讨论】:

      【解决方案3】:

      区别仅在于您是否仍需要对文字字符串的引用。从内存管理 POV 和对象创建 POV 来看,这真的无关紧要。不过要记住的一件事是,第二个示例在调试时稍微容易一些。我的首选版本如下所示:

      NSString *fileName = @"image";
      NSString *tempName = [fileName stringByAppendingString:@".png"];
      NSLog(@"TEST  : %@", tempName);
      

      但最终这只是一个偏好问题。

      【讨论】:

        【解决方案4】:

        我认为你是对的,这真的取决于首选风格。

        我个人喜欢你的第一个例子,代码不复杂,第一个版本简洁明了。在第二个示例中隐藏了太多的“语言”。

        如前所述,内存管理在示例中似乎不是问题。

        【讨论】:

          猜你喜欢
          • 2015-01-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-07-16
          • 2011-05-26
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多