Функция NSString - PullRequest
       11

Функция NSString

1 голос
/ 11 января 2010

Я получаю нулевое возвращение, когда пробую свою функцию 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, просто чтобы показать ответ в NSlog

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

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

Я получил нулевой ответ? Я что-то пропустил? Спасибо.

Редактировать некоторые в 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];
}

Вот как это должно работать.

getTrackNumberUrl -> setTrackNumberUrl -> trackUrl (возврат) -> setTrackNumberUrl + trackNumber -> getTrackNumberUrl (trackNumberUrl = trackUrl + trackNumber)


У меня есть этот код для установки ссылки на дорожку

@class Track;

@interface MainView : UIView {


    Track *track;
}

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

Ну, если не стоит использовать self alloc, что я должен использовать?

Ответы [ 3 ]

1 голос
/ 11 января 2010

У вас много проблем с вашим кодом.

return [trackUrl stringByAppendingFormat:trackNumberUrl];

Вы не должны использовать произвольную строку в качестве формата, потому что если она содержит спецификатор формата, такой как "% d", тогда метод будет искать переменную, которой там нет, и, скорее всего, произойдет сбой. Вы должны использовать stringByAppendingString: вместо этого. Однако, похоже, что это не то, что вам нужно, поскольку имя метода - setTrackNumberUrl:. Если вы хотите изменить значение переменной trackUrl, вы не можете вызвать stringByAppendingFormat:; все, что нужно, это вернуть новую строку и оставить оригинал в покое. Я думаю, вы просто хотите что-то вроде

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

Другая проблема:

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

В этом контексте self является экземпляром Track. Экземпляр не поймет сообщение alloc, которое должно быть отправлено классу. Он вернет новый экземпляр, на который вы должны отправить сообщение init. Так что вы бы сделали что-то вроде [[Track alloc] init].

NSLog(trackNumber);

Первый параметр NSLog - это строка формата, поэтому по тем же причинам, что и выше, вы не должны использовать переменную, вы должны сделать что-то вроде этого: NSLog(@"%@", trackNumber); Эта строка кода выводит значение переменной trackNumber , Учитывая, что у вас есть метод с именем trackNumber прямо над ним, мне интересно, действительно ли вы хотите вызвать метод и получить результат. В этом случае вам нужно записать его как [self trackNumber], который будет вызывать метод и возвращать строку NSString.

1 голос
/ 11 января 2010

Скорее всего track - это nil в trackNumber - вы установили правильную ссылку на Track объект?

Также этот код

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

неверно. Почему вы используете [self alloc]? Вы выделяете новый объект Track (используя статический метод для ссылки на объект, а не для имени класса, что является ошибкой), устанавливаете URL-адрес номера дорожки и возвращаете автоматически выпущенный NSString, но утечка выделенного объекта Track.

0 голосов
/ 11 января 2010
return [trackUrl stringByAppendingFormat:trackNumberUrl];

Я не уверен насчет этого, попробуйте использовать его в качестве формата для строки.

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