initWithFormat не имеет особого смысла после 2 часов? - PullRequest
0 голосов
/ 08 августа 2011

Будучи «новичком», я в течение 2 часов смотрел на документацию и справочную информацию по API, пытаясь выяснить, что я делаю неправильно, и мои глазные яблоки теперь кровоточат. Следующий код продолжает выдавать предупреждение «желтый треугольник» в xcode 4. (Форматировать не строковый литерал и не форматировать аргументы)

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

-(IBAction)saveZip:(id)sender
{
    zipCode = [[NSString alloc] initWithFormat:zipText.text];
    [zipText setText:zipCode];
    NSUserDefaults *zipDefault = [NSUserDefaults standardUserDefaults];
    [zipDefault setObject:zipCode forKey:@"ZipCode"];
}

Ответы [ 2 ]

4 голосов
/ 08 августа 2011

Вы должны использовать строку литерал для формата в методе initWithFormat:, а не строку, поэтому ваш вызов должен быть исправлен на:

zipCode = [[NSString alloc] initWithFormat:@"%@", zipText.text];

Но в вашем примере вы этого не сделаетенужен этот метод вообще, поскольку вы фактически не меняете строку, поэтому следующий «шаг исправления» может быть

zipCode = [zipText.text copy];

Но это также оставляет одну проблему нерешенной - ваше предыдущее значение zipCode не будет освобождено ибудет просто утечка. Если zipCode является переменной экземпляра в вашем классе, объявите свойство для него:

// Class interface
@property (nonatomic, copy) NSString *zipCode;
// Class implementation
@synthesize zipCode;

Таким образом, вы позволите компилятору автоматически синтезировать методы сеттера и геттера для вашей переменной, которая будетОтрегулируйте управление памятью для вас. Теперь, чтобы изменить значение iVar, вы можете использовать свойство:

self.zipCode = zipText.text;

PS и, наконец, не забудьте выпустить ваш zipCode в методе dealloc, чтобы избежать утечек памяти

1 голос
/ 08 августа 2011

initWithFormat: ожидает строку формата, за которой следует список аргументов, соответствующих спецификаторам формата в вашей строке.Например:

NSString *city = @"East Aurora";
NSString *state = @"NY";
NSInteger numericZip = 14052;
NSString *lastLineOfAddress = [[NSString alloc] initWithFormat:@"%@, %@ %d", city, state, numericZip];

В этом примере lastLineOfAddress будет ссылаться на строку @"East Aurora, NY 14052".В строке формата есть три спецификатора формата.Первые два спецификатора формата - %@, которые могут быть заполнителями для любого типа объекта.%d является заполнителем для десятичного целочисленного значения.Три параметра, следующие за строкой формата, соответствуют этим трем спецификаторам формата.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...