Objective-C memory management problem -


i'm getting exc_bad_access error, , it's because of part of code. basically, take input , work on it. after multiple inputs, throws error. doing wrong memory here? i'd post rest of code, it's rather long -- , think may problem lies (it's xcode points me, @ least).

-(ibaction) findshows: (id) clicked {       char urlchars[1000];     [self geteventurl: urlchars];     nsstring * theurl = [[nsstring alloc] initwithformat:@"%s", urlchars];      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]);     [self parseeventdata: eventdata datalength: thelength];     [whatisshowing setstringvalue:@"showing events artist"]; } 

when crash occurs, there backtrace.

post it.

either program break in debugger, , call stack in debugger ui (or can type 'bt

with that, cause of crash quite obvious. without that, left critique code.

so, here goes....


char urlchars[1000]; [self geteventurl: urlchars]; 

this is, @ best, security hole and, @ worst, source of crash. time going copy bytes buffer, there should kind of way (a) limit # of bytes copied in (pass length of buffer) , (b) # of bytes copied returned (0 failure or no bytes copied).

given above, happens if there 1042 bytes copied urlchars geteventurl:? boom

nsstring * theurl = [[nsstring alloc] initwithformat:@"%s", urlchars]; 

this making assumptions urlchars lead failure. first, assumes urlchars of proper %s compatible encoding. secondly, assumes urlchars null terminated (and didn't overflow buffer).

best use 1 of various nsstring methods create strings directly buffer of bytes using particular encoding. more precise , more efficient.

nsdata *data = [nsdata datawithcontentsofurl:[nsurl urlwithstring:theurl]]; 

i hope isn't on main thread... 'cause it'll block if , that'll make app unresponsive on slow/flaky networks.

int thelength = [data length]; nsstring *content = [nsstring stringwithutf8string:[data bytes]];  char eventdata[[data length]]; strcpy(eventdata, [content utf8string]); 

this least efficient possible way of doing this. there no need create nsstring instance turn (char *). grab bytes data directly.

also -- sure data returned null terminated? if not, strcpy() gonna blow right past end of eventdata buffer, corrupting stack.

[self parseeventdata: eventdata datalength: thelength]; [whatisshowing setstringvalue:@"showing events artist"]; 

what kind of data parsing want parse raw bytes? in cases, such data should of kind of structured type; xml or, even, html. if so, there no need drop down parsing raw bytes. (not raw data unheard of -- odd).


Comments

Popular posts from this blog

asp.net - repeatedly call AddImageUrl(url) to assemble pdf document -

java - Android recognize cell phone with keyboard or not? -

iphone - How would you achieve a LED Scrolling effect? -