Приложение для iPhone случайно закрывается при доступе к NSString - PullRequest
2 голосов
/ 24 февраля 2010

У меня проблема с NSString в моем приложении.
Я определил это в заголовочном файле моего контроллера представления.

    NSString *locationCoordinates;

и я устанавливаю его значение в методе - (void).

- (void)locationUpdate:(CLLocation *)location {
    <...>

    NSArray *locArray = [locString componentsSeparatedByString:@", "];

    NSString *xCoordinate = [locArray objectAtIndex:0];
    NSString *yCoordinate = [locArray objectAtIndex:1]; 

    locationCoordinates = [NSString stringWithFormat:@"%@,%@", xCoordinate, yCoordinate];
}

В этом методе я могу напечатать это на консоли с

NSLog(locationCoordinates);

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

- (IBAction)saveAndReturnToRootView {
    NSLog(locationCoordinates);
}

Консоль говорит мне:

2010-02-24 14:45:05.399 MyApp[73365:207] *** -[NSCFSet length]: unrecognized selector sent to instance 0x4c36490
2010-02-24 14:45:05.400 MyApp[73365:207] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[NSCFSet length]: unrecognized selector sent to instance 0x4c36490'
2010-02-24 14:45:05.401 MyApp[73365:207] Stack: (
  32887899,
  2434934025,
  33269819,
  32839286,
  32691906,
  32417461,
  32527181,
  32527085,
  32747749,
  356942,
  630491,
  63461,
  2868313,
  4782069,
  2868313,
  3275682,
  3284419,
  3279631,
  2973235,
  2881564,
  2908341,
  40984273,
  32672640,
  32668744,
  40978317,
  40978514,
  2912259,
  9744,
  9598
)

Как я могу решить эту проблему?

Заранее спасибо; -)

Ответы [ 2 ]

7 голосов
/ 24 февраля 2010

Вы не сохраняете строку, поэтому память очищается. Это вызывает сбой при попытке доступа к нему.

Чтобы сохранить его, вы можете добавить следующую строку

[locationCoordinates retain];

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


В Objective C принято использовать свойства для таких членов класса. В заголовочном файле используйте

@property (nonatomic, retain) NSString *locationCoordinates;

Затем в реализации Чака в

@synthesize locationCoordinates;

При доступе к locationCoordinates доступ к нему через себя как:

self.locationCoordinates = [NSString stringWithFormat:@"%@,%@", xCoordinate, yCoordinate];

Objective C создаст свойство получения и установки, которое будет обрабатывать удержание для вас наиболее эффективным способом.

Кстати, ключевое слово nonatomic в свойстве указывает цели c, что оно вам не нужно для создания какой-либо синхронизации потоков вокруг доступа к свойству. Если вы собираетесь использовать многопоточность класса, вам следует рассмотреть возможность удаления nonatomic . Это тогда гарантирует, что доступ к свойству является потокобезопасным.

Нет смысла делать какую-либо работу, которую вы можете заставить компилятор сделать для вас!

5 голосов
/ 24 февраля 2010

Вы должны сохранить строку при сохранении ее в переменной вашего класса:

locationCoordinates = [NSString stringWithFormat:@"%@,%@", xCoordinate, yCoordinate];
[locationCoordinates retain];

Причина в том, что [NSString stringWithFormat: ...] возвращает автоматически выпущенный экземпляр. Строка будет автоматически освобождена после завершения функции.

Вы также можете скопировать строку:

locationCoordinates = 
    [[NSString stringWithFormat:@"%@,%@", xCoordinate, yCoordinate] copy];

И, конечно, не забудьте снова выпустить его в dealloc :

- (void) dealloc {
    [locationCoordinates release];

    [super dealloc];
}
...