【问题标题】:NSURLConnection failure questionsNSURLConnection 失败问题
【发布时间】:2009-04-09 04:29:37
【问题描述】:

我正在使用下面列出的 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.) 我在我的应用程序委托中执行此操作。唯一的协议是 UIApplicationDelegate。如果没有委托,所有 NSURLConnection 方法如何工作?

【问题讨论】:

    标签: iphone cocoa memory-management nsurlconnection


    【解决方案1】:

    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.) 我在我的应用程序委托中执行此操作。唯一的协议是 UIApplicationDelegate。如果没有委托,所有 NSURLConnection 方法如何工作?

    你说delegate:self,所以你是连接的代表。

    至少在 Mac 上,NSURLConnection 将方法归类到 NSObject 上,因此它们总是可用的,至少在无操作形式下是可用的。您覆盖这些实现,因此当 NSURLConnection 向您的连接委托(您)发送这些消息时,它们会通过您提供的实现。

    【讨论】:

    • 1.) 它是如何做到的?既不分配。 2.) 当您说响应代码时,您指的是建议文件名还是 MIMEType?看不到响应码。 3.) 很酷 - 记录在哪里?谢谢。
    • 1.正如我所说,引用计数方法对字符串文字对象是无操作的。但不要依赖于此。另外,正如我所说,我知道你没有分配:这就是为什么你不应该释放它。 2. 不,我的意思是响应代码。实现我告诉你的委托方法。 3. 在 NSURLConnection 文档中。
    • 获得响应对象后(在委托方法中),您将向其发送 statusCode 消息以获取响应代码。 developer.apple.com/documentation/Cocoa/Reference/Foundation/…
    • - (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response 没有状态码。那是在我没有使用的 NSHTTPURLResponse 中。什么意思?
    • 我的意思正是你认为我的意思。该响应对象在您使用 HTTP 的任何时候都是一个 NSHTTPURLResponse,如 developer.apple.com/documentation/Cocoa/Conceptual/… 中所述(有点倾斜)。
    猜你喜欢
    • 2015-12-18
    • 2011-08-01
    • 1970-01-01
    • 2012-10-18
    • 2011-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多