Objective-C-crash bij het toevoegen van array aan het tekstveld van textview

Ik ben nieuwer voor Objective-C, hoewel ik in Java, C en C ++ heb gewerkt en ik nog steedsobjective-caan het leren ben.

Ik heb een socket, een ontvangstgegevensfunctie en een tekstweergave. Naarmate de gegevens binnenkomen, wil ik deze aan de tekstweergave toevoegen. Nu heeft mijn tekstweergave een vooraf ingevulde tekst aan het begin. Als ik bij elke oproep om gegevens te ontvangen die binnenkomen, krijg ik gewoon de huidige tekst van de tekstweergave, voeg deze aan zichzelf toe in een nsstring met:

 NSString *oldtext = [mTextViewAlias text];
 NSString *toSend = [oldtext stringByAppendingString: oldtext];

en stel de tekstweergave in op toSend , het werkt goed en ik zie de gegevens groeien in mijn tekstweergave.

Het probleem is, ik wil toevoegen:

 UInt8 buffer[len];//which has data from the socket. len is set to amount of data on each call of receive data as follows
 int len = CFDataGetLength(df);

Wat ik geprobeerd heb te doen is een buffer naar een nsstring omzetten en toevoegen. bijvoorbeeld:

NSString *newdata = [NSString stringWithUTF8String: buffer];

het komt bij me op dat de buffer niet eindigt met een '\ 0' -teken, dus ik heb zelfs een nieuwe buffer gemaakt met de naam char newbuffer [len + 1]; en gekopieerd buffer erin en voeg een \ 0 toe als het laatste teken.

Ik kan de eerste keer rondhangen bij de eerste passage van nieuwe gegevens, maar de tweede toevoeging, toe te voegen aan iets waarvan de tekens uit de buffer ooit aan de tekst waren toegevoegd, crasht altijd.

I did a little trick where if len > 10 assign buffer[10]='\0'. And it actually let me grab data twice before crashing the third time.

Het lijkt erop dat ik een van de twee problemen heb en ik weet niet zeker hoe ik dit moet oplossen. Een daarvan is dat ik alleen zoveel gegevens kan verzamelen als in de buffer en dat deze nsstring s op de een of andere manier ervan afhankelijk zijn en wanneer ik de buffer wijzig wanneer ik gegevens ontvang, wordt deze opnieuw genoemd omdat deze de crash veroorzaakt. Of misschien is het gewoon nog steeds een probleem met de '\ 0' die er niet is, hoewel ik niet zie hoe.

0
Het is een socket meer zoals Telnet. de verbinding is voor een chat- en gameserver, maar het heeft een aantal indelingen die je kunt inschakelen om de onbewerkte feed te ordenen maar dan nog steeds om onbewerkte tekst te verzenden. Ik weet gewoon hoe ik het beter moet indelen met indelingen. kreeg zoiets als: CFDataGetBytes (df, range, buffer);
toegevoegd de auteur LanternMike, de bron
Misschien heb je meer geluk met een NSMutableData-klasse als je buffer in plaats van een pure C-array. Wanneer ik voor Obj-C programmeer, probeer ik het allemaal Obj-C te houden, omdat de conversies een beetje harig kunnen worden. Ik zal de documentatie over sommige dingen moeten opzoeken en dan heb ik misschien een echt antwoord voor je
toegevoegd de auteur Russ, de bron
vind je het erg om de code en/of functie te tonen die de gegevens uit de socket ontvangt? Ontvang je het alleen als een C-array? Ik ga er ook van uit dat u niet alleen gegevens van een URL ophaalt, maar er zijn echt leuke functies in de API om dit automatisch voor u te doen.
toegevoegd de auteur Russ, de bron

1 antwoord

Probeer zoiets als dit:

NSMutableData *buffer = [[NSMutableData alloc] init];
[buffer appendBytes:aCArray length:lengthOfaCArray];
NSString *newdata = [[NSString alloc] initWithData: buffer encoding:NSASCIIStringEncoding];

//When your finished with newdata and buffer, dont forget to release it
//This might be done automatically if you have Automatic Reference Counting (ARC) on
[newdata release];
[buffer release];

Volledige referentie over de coderingstypen hier . Geen garanties dat dit werkt, aangezien ik deze code heb geschreven vanaf een Windows-machine en een paar tabbladen open op de ontwikkelaarssite van Apple. Maar zou u in de juiste richting moeten helpen.

0
toegevoegd
Ik heb geprobeerd om dat als volgt te volgen: char buffer2 [len]; for (int a = 0; a 10)//newbuffer [10] = '\ 0';//NSString * newdata = [NSString stringWithUTF8String: newbuffer]; NSString * toSend = [oldtext stringByAppendingString: newdata];
toegevoegd de auteur LanternMike, de bron
zonder regels die zijn becommentarieerd, is dat: char buffer2 [len]; for (int a = 0; a
toegevoegd de auteur LanternMike, de bron
wil dat toevoegen met alleen: NSString * newdata = [NSString stringWithUTF8String: newbuffer]; En ik heb gewoon het tekstveld ingesteld op de huidige gegevens (de geschiedenis verliezen), het werkt prima. met mijn originele methode lijkt het erop dat meerdere toevoegingen van nieuwe gegevens, na de eerste, crashen.
toegevoegd de auteur LanternMike, de bron
nee ik heb het mis, je lijkt gelijk te hebben. Heb het werkend. blijkbaar tegen het einde van mijn crashes creëerde ik op een of andere manier een breekpunt. verwijderde dat en draaide de code die je gaf en het werkte. mijn enige vraag is nu wanneer ik moet vrijlaten. ik zal proberen beide aan het einde van de functie te bevrijden en zien of dat werkt. ik heb automatische referentietelling. bedankt Mike
toegevoegd de auteur LanternMike, de bron
Aan het einde van de functie zou het goed moeten zijn om te bevrijden (bevrijden). Wanneer u het tekstveld een NSString toewijst, moet het de waarde kopiëren naar zijn eigen variabele. Ook als u de gegevens slechts één keer gaat gebruiken en geen veranderbare versie nodig hebt, kunt u zoiets als NSData * buffer3 = [[NSData-toewijzing] initWithBytes: cArray length: len]; gebruiken wil dat opzoeken omdat ik het misschien niet perfect heb op de parameters, Xcode autocomplete is daar echter goed in. Ik denk dat ARC het geheugenbeheer voor je zal regelen, zodat je je geen zorgen hoeft te maken over vrijgeven, geen expert op het gebied van ARC.
toegevoegd de auteur Russ, de bron