iCulture forum | iPhone, iPad,  iPod touch, Apple TV en iOS

iCulture forum | iPhone, iPad, iPod touch, Apple TV en iOS (https://forum.iculture.nl/)
-   Ontwikkelen voor iOS (https://forum.iculture.nl/f133/development/f58/ontwikkelen-voor-ios/)
-   -   3x method call fails (https://forum.iculture.nl/f133/development/f58/ontwikkelen-voor-ios/41234-3x-method-call-fails.html)

michiel3 08-08-09 10:39

3x method call fails
 
Ik ben nieuw in de Objective-C-wereld, vandaar dat ik ook tegen een klein maar vervelend probleem ben aangelopen.

Ik heb de volgende functie gemaakt:
Code:

- (NSString*) test:(NSString *)str {
        NSLog(str);
       
        return str;
}

De functie vraagt om een string, drukt deze af in de console met NSLog en retourneert deze vervolgens weer. Van oorsprong was het een functie die ascii naar hexadecimaal omzette. Omdat ik tegen het probleem aan liep heb ik het geprobeerd met een simpelere functie.

Ik roep het volgende aan:
Code:

NSString *string1 = [self test:@"test1"];
NSString *string2 = [self test:@"test2"];
NSString *string3 = [self test:@"test3"];

Ik maak hier drie strings door ze door die functie te halen. Bij mijn weten zouden ze alle drie moeten worden afgedrukt via NSLog(). Het compileren gaat goed, maar bij het debuggen in de simulator stopt de debugger er gewoon mee en loopt het programma vast.

Als ik de derde call weghaal, dus alleen string1 en string2, dan krijg ik netjes 'test1' en 'test2' in m'n console.

Het volgende werkt ook:
Code:

[self test:@"test1"];
[self test:@"test2"];
[self test:@"test3"];

Iemand enig idee wat ik verkeerd doe? Zal wel een stom foutje zijn.

Rockafello 08-08-09 15:44

Probeer het eens op deze manier:

Code:

NSString *string1 = [[self test:@"test1"] retain];
de retain zorgt ervoor dat de variabele ook buiten je functie nog gebruikt kan worden.

overigens vind ik de manier waarop je dit doet niet heel erg mooi.

michiel3 08-08-09 16:33

Dat werkt ook niet, helaas. Overigens werkt het met twee strings dan ook niet meer...

Het zal ongetwijfeld slordig zijn, ben slechts in den beginne. Heb je tips? :)

Rockafello 08-08-09 16:45

Code:

-(void) init {
  NSString *string1 = [[NSString stringWithFormat:@"test1"] retain];
  NSString *string2 = [[NSString stringWithFormat:@"test2"] retain];
  NSString *string3 = [[NSString stringWithFormat:@"test3"] retain];

  [self test:string1];
  [self test:string2];
  [self test:string3];
}


-(void) test:NSString *)str {
    NSLog(str);
}

En op deze manier?

ben overigens ook nog niet zo lang bezig met objective-c. maar het is wel leuk om ff uit te zoeken :)

michiel3 08-08-09 18:22

Dat werkt dan weer wel. Maar dat is niet helemaal wat ik zoek. Het voorbeeld wat ik gaf is misschien wat raar, maar het was de bedoeling dat het hiervoor ging werken:

Code:

- (id) hexValue:(NSData *)data {
    NSMutableString *hex = [NSMutableString string];
   
    unsigned char *bytes = (unsigned char *)[data bytes];
    char temp[3];
   
    int i = 0;
    for (i = 0; i < [data length]; i++) {
        temp[0] = temp[1] = temp[2] = 0;
        (void)sprintf(temp, "%02x", bytes[i]);
        [hex appendString:[NSString stringWithUTF8String: temp]];
    }
   
    return hex;
}

Deze functie zet een NSData om naar hex en retourneert daarvan een string.

Ik roep de methode als volgt aan in een void-method (actie achter een click event op een UIButton):
Code:

NSString* test = [self hexValue:[@"Test" dataUsingEncoding:NSUTF8StringEncoding]];
NSLog(test);

Dit drukt de hexwaarde van de string Test af. Als ik dan nog een tweede string maak en ook af druk, dan gaat het mis en blijft het programma hangen en stopt de debugger. Dus dit gaat al mis:

Code:

NSString* test = [self hexValue:[@"Test" dataUsingEncoding:NSUTF8StringEncoding]];
NSLog(test);
NSString* test2 = [self hexValue:[@"Test" dataUsingEncoding:NSUTF8StringEncoding]];
NSLog(test2);

Het vreemde is als ik een stukje code daarboven weghaal, dan lukt het me wel om test en test2 af te drukken met NSLog(). Het stuk code dat ik weghaal d.m.v. comments is als volgt (en zal ongetwijfeld wat slordig zijn):

Code:

NSArray *charset;
NSArray *years;
           
charset = [NSArray arrayWithObjects:    @"0",@"1",@"2",@"3",@"4",@"5",@"6",@"7",@"8",@"9",
                                            @"A",@"B",@"C",@"D",@"E",@"F",@"G",@"H",@"I",@"J",
                                            @"K",@"L",@"M",@"N",@"O",@"P",@"Q",@"R",@"S",@"T",
                                            @"U",@"V",@"W",@"X",@"Y",@"Z"];
   
years = [NSArray arrayWithObjects:    @"2006"];
   
NSMutableArray *weeks = [self getWeekNumbers];

Iets te maken met memory o.i.d.?

michiel3 08-08-09 18:45

Lol! Ik heb de oplossing gevonden, ik had in de array het laatste item niet aangegeven door nil mee te geven!

Vreemd dat hij dan nog wel doorgaat en pas na een hoopje code stopt met werken... ;)

Anyways, toch bedankt voor de hulp!

gekkepietje 08-08-09 22:07

Citaat:

Oorspronkelijk geplaatst door michiel3 (Bericht 335614)
Vreemd dat hij dan nog wel doorgaat en pas na een hoopje code stopt met werken... ;)

Dat is altijd zo met C-achtige talen. Doe je iets fout dan krijg je rare crashes. :)


Alle tijden zijn GMT +2. Het is nu 10:44.