2010-01-11 5 views
1

Je reçois un retour NULL lorsque j'essaie ma fonction NSString.Fonction NSString

//Track.m 

static NSString* trackUrl; 
//static NSString* getTrackNumberUrl; 

@implementation Track 

- (NSString*)trackUrl { 
    return @"http://site.com/?a="; 
} 

- (NSString*)setTrackNumberUrl:(NSString*)trackNumberUrl { 
    if (trackUrl != trackNumberUrl) { 
     return [trackUrl stringByAppendingFormat:trackNumberUrl]; 
    } 

return @"Error no trackNumber"; 
} 

- (NSString*)getTrackNumberUrl:(NSString*)trackNumber { 
return [[[self alloc] setTrackNumberUrl:trackNumber] autorelease]; 
} 

@end 

MainView.m, juste pour montrer la réponse de retour dans NSLog

- (NSString *) trackNumber{ 
return [track getTrackNumberUrl:@"86147224549XX"]; 
} 

- (void)drawRect:(CGRect)rect { 
NSLog(trackNumber); 
} 

Je reçois une réponse nulle de retour? Ai-je manqué quelque chose? Merci.

Modifier certains dans Track.m

- (NSString*)setTrackNumberUrl:(NSString*)trackNumberUrl { 
    if (trackUrl != trackNumberUrl) { 
     return [trackUrl stringByAppendingString:trackNumberUrl]; 
    } 

    return @"Error no trackNumber"; 
} 

- (NSString*)getTrackNumberUrl:(NSString*)trackNumber { 
    return [[[Track alloc] setTrackNumberUrl:trackNumber] init]; 
} 

Voici comment cela devrait fonctionner.

getTrackNumberUrl -> setTrackNumberUrl -> trackUrl (retour) -> setTrackNumberUrl + TrackNumber -> getTrackNumberUrl (trackNumberUrl = trackUrl + TrackNumber)


J'ai ce code pour définir la référence à la piste

@class Track; 

@interface MainView : UIView { 


    Track *track; 
} 

@property (nonatomic, retain) IBOutlet Track *track; 

Eh bien, si vous ne deviez pas utiliser self alloc, que dois-je utiliser?

Répondre

1

Vous avez beaucoup de problèmes avec votre code.

return [trackUrl stringByAppendingFormat:trackNumberUrl]; 

Vous ne devriez pas utiliser une chaîne arbitraire en tant que format, parce que si elle contient un spécificateur de format comme « % d » alors la méthode sera la recherche d'une variable qui est pas là, et va probablement planter. Vous devriez plutôt utiliser stringByAppendingString:. Cependant, cela ne semble pas être ce que vous voulez ici, puisque le nom de la méthode est setTrackNumberUrl:. Si vous voulez changer la valeur de la variable trackUrl, vous ne pouvez pas appeler stringByAppendingFormat:; tout ce que cela fait est de retourner une nouvelle chaîne et de laisser l'original seul. Je pense que vous voulez simplement quelque chose comme

[trackUrl release]; 
trackUrl = [trackNumberUrl retain]; 

Un autre problème:

return [[[self alloc] setTrackNumberUrl:trackNumber] autorelease]; 

Dans ce contexte, self est un exemple de piste. Une instance ne comprendra pas le message alloc, qui doit être envoyé à une classe. Il renverra une nouvelle instance, à laquelle vous devriez envoyer un message init. Donc, vous feriez quelque chose comme [[Track alloc] init].

NSLog(trackNumber); 

Le premier paramètre à NSLog est une chaîne de format, pour les mêmes raisons que ci-dessus, vous ne devriez pas utiliser une variable, vous devez faire quelque chose comme ceci: NSLog(@"%@", trackNumber); Cette ligne de code imprime la valeur de la variable , numéro de piste. Considérant que vous avez une méthode nommée trackNumber juste au-dessus, je me demande si ce que vous voulez vraiment faire est d'appeler la méthode et d'obtenir le résultat. Dans ce cas, vous devez l'écrire comme [self trackNumber] qui appellera la méthode et retournera un NSString.

+1

"Vous devez initialiser trackUrl à zéro." Les variables statiques sont automatiquement initialisées à zéro. – kennytm

+0

Je veux appeler la fonction getTrackNumberUrl dans Track. Le getTrackNumberUrl collecte des informations à partir de setTrackNumberUrl comment obtenir l'URL de base de trackUrl. –

+0

J'ai corrigé que vous écrivez, mais il renvoient toujours nul –

1

Très probablement track est nil dans le trackNumber - avez-vous le mettre à une référence correcte à un objet Track?

De plus, ce code

- (NSString*)getTrackNumberUrl:(NSString*)trackNumber { 
    return [[[self alloc] setTrackNumberUrl:trackNumber] autorelease]; 
} 

est incorrect. Pourquoi utilisez-vous [self alloc]? Vous allouer un nouvel objet Track (en utilisant une méthode statique sur une référence d'objet, pas sur un nom de classe, qui est une erreur), en définissant son URL de numéro de piste et en renvoyant un NSString autoreleased, mais vous fuyez l'objet Track vous avez alloué.

0
return [trackUrl stringByAppendingFormat:trackNumberUrl]; 

Je ne suis pas sûr combat celui-ci, essayer de l'utiliser comme un format de chaîne.

return [trackUrl stringByAppendingFormat:@"%@",trackNumberUrl];