当作为参数iphone传递时,NSURL变为null

时间:2011-08-29 14:29:40

标签: iphone memory-management methods parameters null

我已经设置了几个非常简单的方法,可以使用NSURL和NSStrings。 被调用的第一个方法是getAudio。我想将变量audioPath设置为cleanAudio,以便稍后可以在encryptWithAudioFile中使用它。当问题作为参数传递时,问题就在某个地方,对象变为空。我不知道为什么和我在内存管理方面尝试了所有我能想到的方法来尝试保留对象。我使用的日志工作结果如下
NSLog(@“Clean Audio1:%@”,audioPath);完美,工作原理应该是NSLog(@“Clean Audio2:%@”,audioPath);
NSLog(@“Clean Audio3:%@”,audioPath);
NSLog(@“清洁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 :(得分:0)

我会查看你的内存管理,并确保在你将这个URL传递给这个方法后,你不会过度释放那个URL。我从您当前的代码中可以看到的是(假设您的audioPath属性标记为retain),当您分配它时,实际上您已将其保留在此剪切内:

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

应该是:

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

答案 1 :(得分:0)

看起来好像只在 - [Stub getAudio:]中分配NSURL,对吧?它看起来像你正在创建多个Stub对象。在尝试在该对象上使用audioPath属性之前,您是否在每个对象上调用getAudio:方法?那可能是你的问题。

答案 2 :(得分:0)

在您对该帖子的最新更新中,您将包含2个不同的使用此类的示例。在第一个你有这个:

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

我认为这是有效的,并且您的“Clean Audio1:”日志显示了预期的URL,这是正确的吗?

在下一个例子中,你有这个:

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

由于这是一个新实例,并且您从未在此实例上调用retrieveAudio,因此该实例的audioPath属性永远不会设置为零。当你调用startEncrption时,它调用encrypterWithAudioFile并传递self.audioPath,它是nil。这不是你期待的,或者我在这里遗漏了什么?

答案 3 :(得分:0)

终于弄明白了。我最终将所有变量移动到我的app委托,并通过指向delegate ::

从其他类引用它们
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

我知道这仍然存在一些内存管理问题,但它终于工作了所以我可以自己想出来。谢谢你的帮助。