Xcode 4警告“ NSURLConnection的表达结果未使用”


72

我只是尝试进行通常的数据传输。我定义我的NSMutableURLRequest然后调用

[[NSURLConnection alloc] initWithRequest:request delegate:self];

Xcode 3过去可以这样做,但Xcode 4会警告我有关该行的“表达式结果未使用”。该请求确实有效,但我想找到一种摆脱警告的方法。

我想我可以将连接存储在变量中,但我并不是真的需要它,也看不到将其设置为nil下一行的意义(尽管这将删除警告)

请注意:我不是100%知道它是Xcode 4还是启用了ARC。

Answers:


182

当函数返回不需要的结果时,可以将其强制转换为void以消除编译器警告:

(void) [[NSURLConnection alloc] initWithRequest:request delegate:self];

我还没有使用过ARC,所以我不能说这是否是个好主意,在ARC之前,您需要将此指针结果保存在某个地方以便可以释放它。


2
这确实消除了警告,并且该功能仍按要求运行,因此一切正常!这是我第一次看到这种消失。这是好习惯吗?谢谢!
约翰

9
是的,因为它记录了一个事实,即您知道会返回结果,但您不需要该结果。
progrmr 2011年

这就是我想要的
Eyad Fallatah 2013年

1
谢谢好人。世界需要更多像你这样的超级英雄:)
Ankit Srivastava

当我尝试使用基于#define的日志记录宏时,我仍然收到警告: #if SHOW_DEBUG_LOG # define DEBUG_LOG(x,...) NSLog(@"Debug Log: "x, __VA_ARGS__) #else # define DEBUG_LOG(x,...) (void)(x); do { (void)(__VA_ARGS__); } while (0) #endif
Dan F

34

progrmr的答案是正确的,但这是一种更干净的方法:

[NSURLConnection connectionWithRequest:request delegate:self];

即使您不将结果强制无效,这也不会引起警告。


自iOS 10起不推荐使用::(
Seva Alekseyev

3

对此应该有人负责NSURLConnection。不需要存储连接,但是如果需要的话,它是更好的编码。问题在于,在您创建NSURLConnection完我们的实例之后,没有人可以找到该实例的指针。

让我们假设以下示例:

  1. 您的实例ClassA正在创建一个实例NSURLConnection
  2. 您的实例ClassA正在释放并释放
  3. NSURLConnection 仍然有效,将把委托激发到您的已释放实例。

为了解决该问题,您应该存储的实例,NSURLConnection并在释放您的实例时释放该连接,ClassA这也会导致释放实例NSURLConnection


由于ARC打开,我无法释放它。ARC应该自动执行的工作是释放指针吗?
约翰,

1
但问题在语义上仍然存在:NSURLConnection知道您的实例,ClassA但没人知道您的实例。这两个实例之间存在一种关系,需要管理这种关系;)但是,如果不保存指向的指针,NSURLConnection则没有人拥有指向它的指针,并且ARC会立即取消分配连接,或者永远不会取消分配连接。如果保存结果指针,则警告将不会出现,并且您具有更好的编码设计,然后您可以编写更可靠的代码:connection:(NSURLConnection*)con didSth{if(con != self.curCon) return;}
thomas
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.