Я должен использовать промежуточную временную переменную при добавлении к NSString?

Мне также не нравится идея использовать таблицы для расположения объектов на странице. Однако это не должно становиться религией - таблицы плохи. Я встретился с одним примером, где я имею расположение на три столбца и нуждался в центральном столбце для роста с содержанием. В конце решение, которое было самым простым и обработанным хорошо на всех необходимых браузерах, состояло в том, чтобы использовать таблицу. По моему скромному мнению, CSS все еще имеет некоторые недостатки, и иногда лучше использовать что-то простое, которое работает, а не просто придерживайтесь вслепую некоторой идеи ('таблицы, плохи...').

7
задан Josh Caswell 31 December 2014 в 19:26
поделиться

4 ответа

Внутренне компиляторы обычно разбивают ваш код на представление, называемое «одиночное статическое присвоение», где данной переменной всегда присваивается только одно значение, и все операторы максимально просты (составные элементы разделены на разные строки). Ваш второй пример следует этому подходу.

Программисты иногда так пишут. Это считается наиболее понятным способом написания кода, поскольку вы можете записывать все операторы как базовые кортежи: A = B, оператор C. Но обычно он считается слишком подробным для кода, который является «очевидным», поэтому это необычный стиль (за исключением ситуаций. где вы пытаетесь сделать очень загадочный код понятным).

Вообще говоря, ваш первый пример не запутает программистов, и он считается приемлемым там, где вы этого не сделаете. Мне снова нужно исходное имя_файла . Однако многие программисты Obj-C рекомендуют следующий стиль:

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

или даже (в зависимости от горизонтального пространства в строке):

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

т.е. если вы используете переменную только один раз, не называйте ее (просто используйте ее в place).

Однако стилистически, если вы следовали подходу Single Static Assigment, вам не следует использовать tempName в качестве имени переменной, поскольку оно не объясняет роль переменной - - вместо этого вы должны использовать что-то вроде fileNameWithExtension . В более широком смысле, я обычно избегаю использования «temp» в качестве префикса, поскольку слишком легко начать называть все «временными» (все локальные переменные временные, поэтому это не имеет большого значения).

поощряйте следующий стиль:

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

или даже (в зависимости от горизонтального пробела в строке):

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

т.е. если вы используете переменную только один раз, не называйте ее (просто используйте ее вместо).

стилистическое примечание: если вы следовали подходу с одним статическим назначением, вам не следует использовать tempName в качестве имени переменной, поскольку оно не объясняет роль переменной - вместо этого вы должны использовать что-то вроде fileNameWithExtension . В более широком смысле, я обычно избегаю использования «temp» в качестве префикса, поскольку слишком легко начать называть все «временными» (все локальные переменные временные, поэтому это не имеет большого значения).

поощряйте следующий стиль:

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

или даже (в зависимости от горизонтального пробела в строке):

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

т.е. если вы используете переменную только один раз, не называйте ее (просто используйте ее вместо).

стилистическое примечание: если вы следовали подходу с одним статическим назначением, вам не следует использовать tempName в качестве имени переменной, поскольку оно не объясняет роль переменной - вместо этого вы должны использовать что-то вроде fileNameWithExtension . В более широком смысле, я обычно избегаю использования «temp» в качестве префикса, поскольку слишком легко начать называть все «временными» (все локальные переменные временные, поэтому это не имеет большого значения).

Однако стилистически, если вы следовали подходу с одним статическим присваиванием, вам не следует использовать tempName в качестве имени переменной, поскольку оно не объясняет роль переменной - вы ' d вместо этого используйте что-то вроде fileNameWithExtension . В более широком смысле, я обычно избегаю использования «temp» в качестве префикса, поскольку слишком легко начать называть все «временными» (все локальные переменные временные, поэтому это не имеет большого значения).

Однако стилистически, если вы следовали подходу с одним статическим присваиванием, вам не следует использовать tempName в качестве имени переменной, поскольку оно не объясняет роль переменной - вы ' d вместо этого используйте что-то вроде fileNameWithExtension . В более широком смысле, я обычно избегаю использования «temp» в качестве префикса, поскольку слишком легко начать называть все «временными» (все локальные переменные временные, поэтому это не имеет большого значения).

12
ответ дан 6 December 2019 в 09:20
поделиться

Разница лишь в том, нужна ли вам еще ссылка на буквальную строку или нет. С точки зрения управления памятью и точки зрения создания объекта это не имеет значения. Однако следует иметь в виду, что второй пример немного упрощает отладку. Моя предпочтительная версия будет выглядеть так:

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

Но, в конце концов, это всего лишь вопрос предпочтения.

2
ответ дан 6 December 2019 в 09:20
поделиться

Думаю, вы правы, это действительно связано с предпочтительным стилем.

Лично мне нравится ваш первый пример, коды не сложные, а первая версия лаконична и проще для глаз. Во втором примере слишком много «языка», скрывающего то, что он делает.

Как уже отмечалось, управление памятью не является проблемой в примерах.

1
ответ дан 6 December 2019 в 09:20
поделиться

Первая строка объявляет литерал NSString. У него есть хранилище, которое длится время жизни процесса, поэтому его не нужно освобождать.

Вызов stringByAppendingString возвращает автоматически выпущенный NSString. Его тоже не следует выпускать, но он будет действовать до следующего слива пула автозапуска. Поэтому присвоение результата вызова stringByAppendingString указателю fileName совершенно нормально в этом случае . В общем, однако, вы должны проверить время жизни вашего объекта и обработать их соответствующим образом (например, если fileName было объявлено как строка, в которой вы владеете памятью, вам нужно будет освободить ее, поэтому потребуется использовать временную память) .

Другая вещь, которую нужно проверить, - это что-то делать с fileName после этого фрагмента - например, удерживать его в переменной экземпляра - и в этом случае вам нужно будет сохранить его.

5
ответ дан 6 December 2019 в 09:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: