Не удается получить NSString ivar для принятия значения из массива

Я сохраняю некоторые данные (некоторые с плавающей запятой, некоторые строки) в plist и затем читаю их обратно. Когда я читаю их обратно, я назначаю их некоторым иварам в моем контроллере вида. Они просто ивары, а не свойства.

Поплавки принимают свои значения отлично, и я могу NSLog их и увидите, что они верны. Но независимо от того, что я пытаюсь, я не могу заставить свои NSString ivars принимать строковые значения.

Пример: позиции массива 6 и 7 имеют строки Portland, OR" а также "Pacific Daylight Time" хранится в них - читать обратно из списка в *array.

Это:

cityName = [NSString stringWithFormat:@"", [array objectAtIndex:6]];
timeZoneName = [NSString stringWithFormat:@"", [array objectAtIndex:7]];
NSLog(@" >cityName from array = %@, and now the iVar is = %@", [array objectAtIndex:6], cityName);
NSLog(@" >timeZoneName from array = %@, and now the iVar is = %@", [array objectAtIndex:7], timeZoneName);

Результаты в этом:

>cityName from array = Portland, OR, and now the iVar is = 
>timeZoneName from array = Pacific Daylight Time, and now the iVar is = 

Я ставлю точку останова в конце метода, где это происходит, и для обоих NSString ivars, всплывающее сообщение говорит: Invalid Summary.

3 ответа

Решение
cityName = [NSString stringWithFormat:@"%@", [array objectAtIndex:6]];

Ошибка в том, что вы пропустили спецификатор формата. В частности, хотя, если объекты в массиве уже являются строками, вы можете просто назначить их прямо в ivar:

cityName = [array objectAtIndex:6];

Будьте осторожны с владением объектом. Вы не являетесь владельцем объекта, возвращенного objectAtIndex: так что если вам нужно использовать этот ивар во многих различных методах, получите право собственности, отправив retainи отказаться от владения, используя release, В качестве альтернативы, если вы решите установить cityName в качестве сохраняющего или копирующего свойства вашего класса используйте метод точечной нотации или метода доступа:

self.cityName = [array objectAtIndex:6];

// or

[self setCityName:[array objectAtIndex:6]];

Если массив содержит NSString случаев нет необходимости звонить +stringWithFormat:, Это пустая трата циклов ЦП и отмена любых потенциальных оптимизаций, связанных с неизменяемыми строками. Кроме того, опираясь на результаты description никогда не бывает правильным ответом (хотя с NSStrings это почти неизбежно - это единственное место, где вы можете положиться на результат).

Это (исправлено):

cityName = [NSString stringWithFormat:@"%@", [array objectAtIndex:6]];
timeZoneName = [NSString stringWithFormat:@"%@", [array objectAtIndex:7]];

Может быть:

cityName = [array objectAtIndex:6];
timeZoneName = [array objectAtIndex:7];

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

Используйте ниже

cityName = [NSString stringWithFormat:@"%@", [array objectAtIndex:6]];

Вам необходимо использовать%d или%i для целых чисел, а%@ используется для строковых объектов.

Другие вопросы по тегам