Не удается получить NSString ivar для принятия значения из массива - PullRequest
0 голосов
/ 30 марта 2011

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

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

Пример: в позициях массива 6 и 7 хранятся строки Portland, OR" и "Pacific Daylight Time" - чтениеиз plist в *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 иваров небольшое всплывающее сообщение гласит: Invalid Summary.

Ответы [ 3 ]

4 голосов
/ 30 марта 2011
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]];
2 голосов
/ 30 марта 2011

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

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

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

Может быть:

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

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

0 голосов
/ 30 марта 2011

Использовать ниже

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

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

...