NSString функция

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


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

@class Track;

@interface MainView : UIView {


    Track *track;
}

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

Хорошо, если не следует использовать самораспределение, что мне использовать?


person Community    schedule 11.01.2010    source источник


Ответы (3)


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

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.

person benzado    schedule 11.01.2010
comment
Вы должны инициализировать trackUrl равным нулю. Статические переменные автоматически инициализируются нулем. - person kennytm; 11.01.2010
comment
Я хочу вызвать функцию getTrackNumberUrl в Track. getTrackNumberUrl собирает информацию из setTrackNumberUrl о том, как получить базовый URL-адрес из trackUrl. - person ; 11.01.2010
comment
У меня есть исправление, которое вы пишете, но оно все равно возвращает null - person ; 11.01.2010
comment
Отличное объяснение. Я думаю, что этот код немного безнадежен... НО, пожалуйста, удалите комментарий об инициализации статической переменной - это неверно, как указал KennyTM. - person Adam Woś; 11.01.2010
comment
@KennyTM: Спасибо, я не знал, где научился так защищаться. - person benzado; 11.01.2010
comment
Да, это было отличное объяснение. Но он по-прежнему возвращает нулевое значение. - person ; 11.01.2010

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

Кроме того, этот код

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

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

person Adam Woś    schedule 11.01.2010

return [trackUrl stringByAppendingFormat:trackNumberUrl];

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

 return [trackUrl stringByAppendingFormat:@"%@",trackNumberUrl];
person Nithin    schedule 11.01.2010