我开始研究iOS的网络编程。我正在关注一个教程并停止,因为我得到了一个"变量从未使用"警告。我找到了另一个以不同方式处理它的教程,但它也创建了一个警告。然后,我决定检查Apple的示例代码,结果发现他们也采用了另一种方式!
教程1: http://codewithchris.com/tutorial-how-to-use-ios-nsurlconnection-by-example/
NSURLConnection *conn = [[NSURLConnection alloc] initWithRequest:request
delegate:self];
教程2: http://www.cimgf.com/2010/02/12/accessing-the-cloud-from-cocoa-touch/
[[NSURLConnection alloc]
initWithRequest:request
delegate:self];
// Declare property in .m file so it doesn't show as public
@property (nonatomic, strong, readwrite) NSURLConnection * connection;
// Then just assign to it when the connection is created
self.connection = [NSURLConnection connectionWithRequest:request delegate:self];
Apple的方法摆脱了警告,但分配给永远不会再读的变量似乎有点浪费。这是最好的做法吗?
答案 0 :(得分:1)
如果您不需要NSURLConnection
变量,请执行以下操作:
[NSURLConnection connectionWithRequest:request delegate:self];
这可以防止您在问题中描述的编译器警告。
如果您希望能够在以后取消请求(例如,用户在连接正在进行时取消视图控制器),那么您将NSURLConnection
保存在属性中,然后在视图控制器被解除时,您可以cancel
请求。
否则,上面显示的语法会启动没有变量且没有编译器警告的连接。
答案 1 :(得分:0)
变量赢了"从不"使用。
connectionWithRequest:delegate:
实际上并没有启动任何网络。在实际启动连接之前,必须在变量上调用start
方法。在启动后,您可以调用变量上的cancel
方法来停止连接。
编辑:根据Rob的评论connectionWithRequest:
,大多数NSURLConnection实例化方法实际上都会启动请求。如果您想要cancel
(并且可能还有其他事情可以使用它),仍会返回变量。
但是,如果您在启动连接后从不想对变量执行任何操作,则还有其他方法可以创建连接。我将对其进行编辑。
您可以使用sendAsynchronousRequest:queue:completionHandler:
,返回void。
对于此方法,您发送请求参数,并为连接提供队列以及连接完成时执行的块。
您也可以像Rob建议的那样做,而不是将返回值放在任何地方:
[NSURLConnection connectionWithRequest:request delegate:self];
如果出于某种原因,你也不喜欢这样,你可以这样做:
@autoreleasepool {
NSURLConnection *foo = [NSURLConnection connectionWithRequest:request delegate:self];
#pragma unused(foo)
}
我想在编辑过程中会直接优化前一个例子:
[NSURLConnection connectionWithRequest:request delegate:self];
作为注释,#pragma unused(someVar)
将禁止给定变量的未使用变量警告。