NSURLConnection失败问题

时间:2009-04-09 04:29:37

标签: iphone cocoa memory-management nsurlconnection

我正在使用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方法如何工作?

1 个答案:

答案 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向您发送连接委托(您)这些消息时,它们会转到您提供的实现。