0

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

4

1 回答 1

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

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

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

于 2009-04-09T06:57:35.107 回答