这有效 - 它确实可以编译 - 但我只是想检查它是否被视为良好做法或是否应该避免?
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);
只是很好奇。
答案 0 :(得分:12)
在内部,编译器通常会将代码分解为名为“单一静态分配”的表示,其中给定变量只分配一个值,所有语句都尽可能简单(复合元素分成不同的行)。你的第二个例子遵循这种方法。
程序员有时会这样写。它被认为是编写代码最清晰的方式,因为你可以将所有语句都写成基本元组:A = B运算符C.但对于“明显”的代码,它通常被认为太冗长,所以它是一种不常见的风格(在情境之外)在那里你试图让非常神秘的代码易于理解)。
一般来说,程序员不会对您的第一个示例感到困惑,如果您不再需要原始fileName
,则认为程序员可以接受。但是,许多Obj-C程序员鼓励以下风格:
NSString *fileName = [@"image" stringByAppendingString:@".png"];
NSLog(@"TEST : %@", fileName);
或甚至(取决于线上的水平空间):
NSLog(@"TEST : %@", [@"image" stringByAppendingString:@".png"]);
即。如果您只使用一次变量,请不要将其命名(只需使用它)。
但是,在风格上,如果您遵循单静态分配方法,则不应使用tempName
作为变量名称,因为它不能解释变量的作用 - 您可以改为使用fileNameWithExtension
之类的东西。从更广泛的意义上讲,我通常避免使用“temp”作为前缀,因为它太容易开始命名所有“temp”(所有局部变量都是临时的,所以它没什么意义)。
答案 1 :(得分:5)
第一行是声明NSString文字。它具有持续整个过程的存储空间,因此不需要释放。
对stringByAppendingString的调用返回一个自动释放的NSString。这也不应该被释放,但会持续到下一个自动释放池排放。 因此,将stringByAppendingString调用的结果分配回fileName指针是非常好的在这种情况下。但是,一般情况下,您应该检查对象生命周期是什么,并相应地处理它们(例如,如果fileName已被声明为您拥有内存的字符串,则需要释放它,因此需要使用临时值)
要检查的另一件事是,如果您在此代码段之后使用fileName执行任何操作,例如在实例变量中持有它 - 在这种情况下你需要保留它。
答案 2 :(得分:2)
区别仅在于您是否仍需要对文字字符串的引用。从内存管理POV和对象创建POV来看,它确实无关紧要。但要记住的一件事是第二个例子使调试时稍微容易一些。我的首选版本看起来像这样:
NSString *fileName = @"image";
NSString *tempName = [fileName stringByAppendingString:@".png"];
NSLog(@"TEST : %@", tempName);
但最后这只是一个偏好问题。
答案 3 :(得分:1)
我认为你是对的,这真的是首选的风格。
我个人喜欢你的第一个例子,代码并不复杂,第一个版本简洁明了。太多的“语言”隐藏了它在第二个例子中所做的事情。
如上所述,内存管理似乎不是示例中的问题。