NSURL становится нулевым при передаче в качестве параметра iphone - PullRequest
0 голосов
/ 29 августа 2011

Я настроил пару очень простых методов, которые работают с NSURL и NSStrings.первый вызываемый метод - getAudio.Я хочу установить переменную audioPath равной cleanAudio, чтобы ее можно было использовать позже в encryptWithAudioFile.Проблема где-то в пути, когда он передается в качестве параметра, объект становится нулевым.Я понятия не имею, почему, и я попробовал все методы, которые я могу представить с точки зрения управления памятью, чтобы попытаться сохранить объект.В журналах я использовал результат работы следующим образомNSLog (@ "Clean Audio1:% @", audioPath);Отлично, работает как надоNSLog (@ "Clean Audio2:% @", audioPath);NSLog (@ "Clean Audio3:% @", audioPath);NSLog (@ "Clean Audio4:% @", audioPath);

@implementation Stub

@synthesize audioPath,
userText;

-(NSURL *)retrieveAudio:(NSURL *)cleanAudio{

self.audioPath = cleanAudio;
NSLog(@"Clean Audio1: %@", audioPath);

return cleanAudio;
}

-(NSString *)retrieveText:(NSString *)message{

self.userText = message;
NSLog(@"Text: %@", self.userText);
NSLog(@"Clean Audio2: %@", audioPath);

return message;
}

-(void)startEncrption{
NSLog(@"Clean Audio3: %@", self.audioPath);
[self encrypterWithAudioFile:self.audioPath withString:self.userText];
}


-(NSURL *)encrypterWithAudioFile:(NSURL *)audio withString:(NSString *)text{
NSLog(@"DIRTY AUDIO and TEXT: %@, %@", audio, text);

return audio;
}

-(void)dealloc{
[super dealloc];
[audioPath release];
[userText release];
}

@end

Редактировать: Вот .h

@interface Stub : NSObject {

NSURL *audioPath;
NSString *userText;

}

-(NSURL *)retrieveAudio:(NSURL *)cleanAudio;
-(NSString *)retrieveText:(NSString *)message;
-(void)startEncrption;
-(NSURL *)encrypterWithAudioFile:(NSURL *)audio withString:(NSString *)text;

@property(nonatomic, retain) NSURL *audioPath;
@property(nonatomic, retain) NSString *userText;

Я вызываю методы в других классах следующим образом:

stubObj = [[Stub alloc] init];
[stubObj retrieveAudio:recordedTmpFile];

и

stubObj2 = [[Stub alloc] init];
[stubObj2 retrieveText:textView.text];
[stubObj2 startEncrption];

Редактировать: Вероятно, я должен был упомянуть, что у меня есть три представления, все с разными контроллерами, работающими на UIScrollView, которые вызывают интерфейс [Stub].

Ответы [ 4 ]

0 голосов
/ 30 августа 2011

Наконец-то разобрался с исправлением. В итоге я переместил все свои переменные в мой делегат приложения и сослался на них из других классов, указав на делегат ::

RonnieD1AppDelegate *appDelegate = (RonnieD1AppDelegate *)[[UIApplication sharedApplication] delegate];

Я вообще удалил метод startEncryption и вызвал метод encryptWithAudioFile следующим образом:

    [stubObj2 encrypterWithAudioFile:appDelegate.audioPath withString:appDelegate.userText];

Мой окончательный код выглядел так:

@implementation Stub

-(NSURL *)retrieveAudio:(NSURL *)cleanAudio{
    RonnieD1AppDelegate *appDelegate = (RonnieD1AppDelegate *)[[UIApplication    sharedApplication] delegate];
    appDelegate.audioPath = cleanAudio;
    NSLog(@"Clean Audio (retrieveAudio): %@", appDelegate.audioPath);

    return cleanAudio;
}

-(NSString *)retrieveText:(NSString *)message{
   // self.audioPath = [NSURL URLWithString:@"TEST"];
    RonnieD1AppDelegate *appDelegate = (RonnieD1AppDelegate *)[[UIApplication sharedApplication] delegate];

    appDelegate.userText = message;
    NSLog(@"Text: %@", appDelegate.userText);
    NSLog(@"Clean Audio (retireveText): %@", appDelegate.audioPath);
    return message;
}

//-(void)startEncrption{
//    NSLog(@"Clean Audio (startEncryption): %@ TEXT: %@", self.audioPath, self.userText);
//    //self.audioPath = [NSURL URLWithString:@"TEST"];
//    [self encrypterWithAudioFile:self.audioPath withString:self.userText];
//    
//}


-(NSURL *)encrypterWithAudioFile:(NSURL *)audio withString:(NSString *)text{
NSLog(@"DIRTY AUDIO and TEXT: %@, %@", audio, text);

    return audio;
}

-(void)dealloc{
    [super dealloc];

}

@end

Я знаю, что с этим все еще есть проблемы с управлением памятью, но он наконец-то работает, так что я могу сам в этом разобраться. Спасибо за вашу помощь.

0 голосов
/ 29 августа 2011

Похоже, что вы выделяете NSURL только в - [Stub getAudio:], верно?Похоже, вы создаете несколько объектов-заглушек.Вы вызываете метод getAudio: для каждого из этих объектов, прежде чем пытаться использовать свойство audioPath для этого объекта?Это может быть вашей проблемой.

0 голосов
/ 29 августа 2011

В вашем последнем обновлении поста вы включили 2 разных примера использования этого класса.В первом у вас есть это:

stubObj = [[Stub alloc] init];
[stubObj retrieveAudio:recordedTmpFile];

Я предполагаю, что это работает, и что ваш журнал «Чистый аудио1:» показывает ожидаемый URL, это правильно?

следующий пример:

stubObj2 = [[Stub alloc] init];
[stubObj2 retrieveText:textView.text];
[stubObj2 startEncrption];

Поскольку это новый экземпляр, и вы никогда не вызываете retrieveAudio для этого экземпляра, свойство audioPath для этого экземпляра никогда не устанавливается, поэтому оно равно nil.Когда вы вызываете startEncrption, он вызывает encrypterWithAudioFile и передает self.audioPath, который равен nil.Разве это не то, что вы ожидаете, или я что-то здесь упускаю?

0 голосов
/ 29 августа 2011

Я бы посмотрел на ваше управление памятью и удостоверился, что вы не переусердствуете с этим URL где-то после того, как вы передали его в эти методы.Из текущего кода я вижу, что (при условии, что ваше свойство audioPath помечено retain), вы фактически перестали его сохранять в этом фрагменте кода при назначении:

self.audioPath = [[NSURL alloc] initWithString:@"TEST"];

Должно быть:

self.audioPath = [NSURL urlWithString:@"TEST"];
...