При сбое происходит обратный след.
Опубликовать это.
Либо ваша программа сломается в отладчике, а стек вызовов будет в интерфейсе отладчика (или вы можете набрать 'bt
При этом причина аварии часто становится совершенно очевидной. Без этого нам остается критиковать код.
Итак, вот так ...
<Ч />
char urlChars[1000];
[self getEventURL: urlChars];
В лучшем случае это дыра в безопасности и, в худшем случае, источник вашей аварии. Каждый раз, когда вы собираетесь копировать байты в буфер, должен быть какой-то способ (а) ограничить количество копируемых байтов (передать длину буфера) и (б) возвращается количество скопированных байтов ( 0 для сбоя или нет скопированных байтов).
Учитывая вышесказанное, что произойдет, если в urlChars
с помощью getEventURL:
скопировано 1042 байта? бум
NSString * theUrl = [[NSString alloc] initWithFormat:@"%s", urlChars];
Это делает некоторые предположения о urlChars
, которые приведут к провалу. Во-первых, предполагается, что urlChars
имеет правильную %s
совместимую кодировку. Во-вторых, предполагается, что urlChars
завершено NULL (и не переполняет буфер).
Лучше всего использовать один из различных методов NSString, которые создают строки непосредственно из буфера байтов с использованием определенной кодировки. Точнее и эффективнее.
NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:theUrl]];
Я надеюсь, что это не в главном потоке ... потому что оно заблокируется, если это так, и это сделает ваше приложение не отвечающим в медленных / нестабильных сетях.
int theLength = [data length];
NSString *content = [NSString stringWithUTF8String:[data bytes]];
char eventData[[data length]];
strcpy(eventData, [content UTF8String]);
Это примерно наименее эффективный способ сделать это. Нет необходимости создавать NSString
экземпляр только для того, чтобы затем превратить его в (char *)
. Просто возьмите bytes
из данных напрямую.
Кроме того - вы уверены, что возвращаемые данные равны NULL? Если нет, то strcpy()
взорвется прямо за концом вашего eventData
буфера, разрушая стек.
[self parseEventData: eventData dataLength: theLength];
[whatIsShowing setStringValue:@"Showing events by this artist"];
Какие данные вы анализируете, что вы действительно хотите проанализировать необработанные байты? Почти во всех случаях такие данные должны быть структурированного типа; XML или даже HTML. Если это так, то нет необходимости переходить к разбору необработанных байтов. (Не то, чтобы необработанные данные были неслыханными - просто странные).