Iphone ObjC对象更改为随机对象:内存问题
长时间侦听器,第一次调用 我有一个基本的记忆问题,我不明白,我相信你们中的任何人都会在一秒钟内看到。我正在四处玩,试图学习使用UIWebView的各种方法,从URL获取字符串,等等。具体来说,我正在尝试从另一个URL获取一个URL。换句话说,我已经将一个html页面上传到web,其中包含一个URL。该页面的地址被编码到应用程序中,给我一个应用程序的“钩子”——我可以随时更改该页面的内容并向应用程序发送新的URL。有道理吗 那么…检索URL?没问题。将其传递到字符串中供以后使用-没问题。但是,当我设置了一个点击手势识别器,它应该获取该字符串,将其转换回NSURL,并在Safari中打开它时,我得到了一个运行时崩溃。一个NSLog调用告诉我,所讨论的字符串一直被分配给各种随机事件 下面是我代码的相关部分。我相信你们中的一些人会告诉我,有更好的方法来做我想做的事——这当然是受欢迎的。但我也很想知道我在这个特定的实现中做错了什么,因为我确信这是一个我想纠正的基本误解 提前谢谢。(对于代码块的格式,我很抱歉——我还没有完全掌握在这里发布的窍门!)Iphone ObjC对象更改为随机对象:内存问题,iphone,objective-c,Iphone,Objective C,长时间侦听器,第一次调用 我有一个基本的记忆问题,我不明白,我相信你们中的任何人都会在一秒钟内看到。我正在四处玩,试图学习使用UIWebView的各种方法,从URL获取字符串,等等。具体来说,我正在尝试从另一个URL获取一个URL。换句话说,我已经将一个html页面上传到web,其中包含一个URL。该页面的地址被编码到应用程序中,给我一个应用程序的“钩子”——我可以随时更改该页面的内容并向应用程序发送新的URL。有道理吗 那么…检索URL?没问题。将其传递到字符串中供以后使用-没问题。但是,当我
@结束
finalURL=[NSString stringWithContentsOfURL:firstUrl
编码:NSASCIIStringEncoding错误:&错误]代码>
上面的一行创建了一个您不拥有的NSString实例(因为您没有调用名称中包含“new”、“alloc”、“retain”或“copy”的方法)。因此,当不再需要时,finalURL
最终将被销毁。当您的-foundTap:
方法运行时,finalURL
已被解除分配,您只是在引用它以前所在的内存位置,现在它可能包含一些其他对象或随机数据
再次阅读内存管理指南,并学习运行静态分析器,该分析器应指出类似的错误。finalURL=[NSString stringWithContentsOfURL:firstUrl
编码:NSASCIIStringEncoding错误:&错误]代码>
上面的一行创建了一个您不拥有的NSString实例(因为您没有调用名称中包含“new”、“alloc”、“retain”或“copy”的方法)。因此,当不再需要时,finalURL
最终将被销毁。当您的-foundTap:
方法运行时,finalURL
已被解除分配,您只是在引用它以前所在的内存位置,现在它可能包含一些其他对象或随机数据
再次阅读内存管理指南,并学习运行静态分析器,该分析器应该指出这样的错误
#import "Messing_With_Web_ViewsViewController.h"
@implementation Messing_With_Web_ViewsViewController
@synthesize tapView;
NSString *finalURL;
- (void)viewDidLoad {
[super viewDidLoad];
NSString *firstString = @"http://www.my_web_address.html";
//Of course, I have the correct address here.
NSURL *firstUrl = [NSURL URLWithString:firstString];
NSError * error;
finalURL = [NSString stringWithContentsOfURL:firstUrl
encoding:NSASCIIStringEncoding error:&error];
if ( finalURL )
{
NSLog(@"Text=%@", finalURL);
//everything fine up to here; console prints the correct
contents of "my web address"
}
else
{
NSLog(@"Error = %@", error);
}
//Taps
UITapGestureRecognizer *tapRecognizer;
tapRecognizer=[[UITapGestureRecognizer alloc]
initWithTarget:self
action:@selector(foundTap:)];
tapRecognizer.numberOfTapsRequired=1;
tapRecognizer.numberOfTouchesRequired=1;
[tapView addGestureRecognizer:tapRecognizer];
[tapRecognizer release];
}
- (void)foundTap:(UITapGestureRecognizer *)recognizer {
NSLog(@"Trying to load %@", finalURL);
//at this point the app either crashes, or the console shows a random memory object
[[UIApplication sharedApplication] openURL:[NSURL URLWithString: finalURL]];
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
}
- (void)viewDidUnload {
}
- (void)dealloc {
[finalURL release];
[super dealloc];
}