在追加到NSString时,我应该使用中间临时变量吗?

fuz*_*oat 7 cocoa coding-style objective-c

这有效 - 它确实可以编译 - 但我只是想检查它是否被认为是好的做法还是要避免的事情?

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

OUTPUT: TEST  : image.png
Run Code Online (Sandbox Code Playgroud)

可以用一个临时变量写得更好:

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

只是好奇.

Mat*_*her 12

在内部,编译器通常会将代码分解为一个名为"单静态分配"的表示,其中给定变量只分配一个值,所有语句尽可能简单(复合元素分成不同的行).你的第二个例子遵循这种方法.

程序员有时会这样写.它被认为是编写代码最清晰的方式,因为你可以将所有语句都写成基本元组:A = B运算符C.但对于"显而易见"的代码,它通常被认为太冗长,所以它是一种不常见的风格(在情境之外)在那里你试图让非常神秘的代码易于理解).

一般来说,程序员不会对你的第一个例子感到困惑,如果你不再需要原件,那么它被认为是可以接受的fileName.但是,许多Obj-C程序员鼓励以下风格:

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

或者甚至(取决于生产线上的水平空间):

NSLog(@"TEST  : %@", [@"image" stringByAppendingString:@".png"]);
Run Code Online (Sandbox Code Playgroud)

即如果你只使用一次变量,不要命名它(只需使用它).

但是,在风格上,如果您遵循单静态分配方法,则不应将其tempName用作变量名称,因为它不能解释变量的作用 - 您可以使用类似的东西fileNameWithExtension.从更广泛的意义上讲,我通常避免使用"temp"作为前缀,因为它太容易开始命名所有"temp"(所有局部变量都是临时的,所以它没什么意义).


phi*_*red 5

第一行是声明NSString文字.它具有持续过程生命周期的存储,因此不需要释放.

对stringByAppendingString的调用返回一个自动释放的NSString.这也不应该被释放,但会持续到下一个自动释放池排放.因此,在这种情况下,将stringByAppendingString调用的结果分配回fileName指针是完全正确的.但是,一般情况下,您应该检查对象生命周期是什么,并相应地处理它们(例如,如果fileName已被声明为您拥有内存的字符串,则需要释放它,因此需要使用临时值) .

要检查的另一件事是,如果您在此片段之后使用fileName执行任何操作 - 例如在实例变量中保留它 - 在这种情况下您需要保留它.