Не удается получить 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 для целых чисел, а%@ используется для строковых объектов.