我有两个类,一个名为“AppController”的控制器和一个名为“URLDelegate”的类,它封装了来自Apple's URL Loading System Programming Guide的示例NSURL代码。
该指南反复提到在其他地方声明receivedData实例变量。我认为这意味着在URLDelagate类之外,因为如果我在URLDelegate类中声明它,我的控制器类就无法“看到”已下载的数据。
我知道收到了数据,因为在我的connectionDidFinishLoading函数中,我有NSLog显示结果:
NSLog(@"Succeeded! Received %d bytes of data",[receivedData length]);
receivedText=[[NSString alloc] initWithData:receivedData encoding: NSASCIIStringEncoding];
NSLog(@"receivedText=%@",receivedText);
所以我对以下问题感到有些困惑:
特别是关于最后一个问题,我觉得我必须忽略一些令人眼花缭乱的明显和根本的东西。如果有人能指出我正确的方向,我会非常感激。
谢谢!
更新:我将所有NSURL函数移出了他们的URLDelegate类,并将它们放在我的控制器类中。我现在能够从connectionDidFinishLoading更新我的控制器类中的变量。这对我来说似乎有些苛刻,但它确实有效。
答案 0 :(得分:1)
1。我应该在哪里声明receivedData?我的控制器类?第三类?
必须在与该方法使用它的方法相同的类中声明它。从你的问题来看,听起来这个类是你的URLDelegate类。由于它在注释中明确地解释为“实例变量”,因此“其他地方”必须是该类的实例变量块中的类自己的标题。
2。我可以像任何普通的NSMutableData变量一样声明它吗?
是。请参阅the relevant chapter of The Objective-C Programming Language。
3。如何将URLDelegate类“访问”此变量?
类不能访问实例中的实例变量,因为它们是实例变量;根据定义,它们是 - 并且因此只能被实例访问。
实例访问其实例变量,就像访问任何本地或全局变量一样,如您所引用的示例代码中所示:
receivedData = [[NSMutableData data] retain];
receivedData
是您在URLDelegate类中声明的实例变量。请注意,您只需使用名称“receivedData”;您不需要使用任何特殊语法来引用实例变量而不是另一个变量。因此,请避免为实例变量和局部变量赋予相同的名称。
您可以通过多种方式将数据提供给应用控制器。一个简单的方法是公开URLDelegate的属性,但这会导致应用程序控制器应该知道如何检索或重新检索属性值的问题。更全面的解决方案列表位于the “Communicating with Objects” chapter of the Cocoa Fundamentals Guide。