我正在使用NSURLConnection,如下所示。关于这门课,我有三个问题。当我连接url值时,调试器会两次触发此行,但不会触及它上面的行:
if (theConnection){
我第二次获得EXC_BAD_ACCESS。使用第一个URL分配(注释掉)工作正常。
1。)有什么区别?
- (void)applicationDidFinishLaunching:(UIApplication *)application {
//NSString *url = @"http://www.abc.com/afile.mp4";
NSString *temp = @"afile.mp4";
NSString *url = [@"http://www.abc.com/" stringByAppendingString:temp];
theRequest = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:url]
cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:30.0];
[url release];
NSURLConnection *theConnection = [[NSURLConnection alloc] initWithRequest:theRequest delegate:self];
if (theConnection) {
receivedData=[[NSMutableData data] retain];
}
2.。)如果我将文件名更改为afile.mp,请求将通过,[receivedData length]的值大约为1600
- (void)connectionDidFinishLoading:(NSURLConnection *)connection
被击中。有没有办法准确检查receivedData是否具有您请求的实际数据。目标文件大约为7MB,但可以从1.5MB到9MB不等。我要求的资源不在那里,但有什么表明吗?
3。)我在我的app委托中这样做。唯一的协议是UIApplicationDelegate。如果没有委托给它们,所有NSURLConnection方法如何工作?
答案 0 :(得分:4)
1。)有什么区别?
- (void)applicationDidFinishLaunching:(UIApplication *)application { //NSString *url = @"http://www.abc.com/afile.mp4"; NSString *temp = @"afile.mp4"; NSString *url = [@"http://www.abc.com/" stringByAppendingString:temp]; theRequest = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:url] cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:30.0]; [url release];
不同之处在于,其中一个让你放弃了你不拥有的东西而另一个却没有。
你没有分配,复制或保留它,所以你不拥有它,所以不要发布它。
作为实现细节,字符串文字不实现引用计数。当您尝试保留或释放它们时,字符串文字对象将忽略您。这就是为什么发布字符串文字的版本不会崩溃的原因,以及创建新字符串和版本的版本。但这是一个实现细节 - 不要依赖它。总是假设释放你不拥有的东西会导致崩溃。
有没有办法准确检查receivedData是否包含您请求的实际数据。
与错误文件相对吗?检查响应代码。
与其他一些数据相反?你可以使用哈希,虽然你如何确定预期的正确哈希值取决于你。但是,可能更容易相信服务器不会给你错误的文件。
我要求的资源不在那里,但有什么表明吗?
是。实施connection:didReceiveResponse:
并检查响应代码。
请注意,如果服务器使用mod_speling或类似的东西,它可能会更正您的URL而不是返回错误 - 例如,通过将您请求的“afile.mp”更改为实际存在的“afile.mp4”
3。)我在我的app委托中这样做。唯一的协议是UIApplicationDelegate。如果没有委托给它们,所有NSURLConnection方法如何工作?
你说delegate:self
,所以你是连接的代表。
在Mac上,至少NSURLConnection将方法分类到NSObject上,因此它们始终可用,至少在非操作形式下。您可以覆盖这些实现,因此当NSURLConnection向您发送连接委托(您)这些消息时,它们会转到您提供的实现。