ChatGPT解决这个技术问题 Extra ChatGPT

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

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

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

这对于 Xcode 3 来说是可以的,但 Xcode 4 在该行警告我“未使用的表达式结果”。该请求确实有效,但我想找到一种方法来消除警告。

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

请注意:我不能 100% 确定它是 Xcode 4 还是启用了 ARC。


p
progrmr

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

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

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


这确实消除了警告,并且该功能仍然按要求工作,所以一切都很好!这是我第一次看到这个演员阵容无效。这是好习惯吗?谢谢!
是的,因为它记录了您知道有一个结果被返回但您不需要该结果的事实。
当我尝试使用基于 #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
E
Elliot

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

[NSURLConnection connectionWithRequest:request delegate:self];

这不会导致警告,即使您没有将结果强制转换为 void。


自 iOS 10 起已弃用。:(
t
thomas

应该有人对那个 NSURLConnection 负责。不需要存储连接,但如果你这样做,它是更好的编码。问题是,在您创建了我们的 NSURLConnection 之后,没有人拥有指向该已创建实例的指针,这不应该是这种情况。

让我们假设以下示例:

您的 ClassA 实例正在创建一个实例 NSURLConnection 您的 ClassA 实例正在释放并且已解除分配 NSURLConnection 仍然存在,并将触发委托给您已解除分配的实例。

要解决这个问题,您应该存储 NSURLConnection 的实例,并且如果您的 ClassA 实例正在被释放,这会导致 NSURLConnection 的实例也被释放,则应该释放该连接。


由于 ARC 开启,我无法释放它。这不是 ARC 应该自动执行的操作,释放指针吗?
但问题在语义上仍然存在:NSURLConnection 知道您的 ClassA 实例,但没有人知道您的实例。两个实例之间存在关系,并且需要管理这种关系;)但是,如果您不保存指向 NSURLConnection 的指针,那么没有人有指向它的指针,并且 ARC 会立即或永远不会释放连接。如果您保存生成的指针,则不会出现警告,并且您有更好的编码设计,然后您可以编写更可靠的代码:connection:(NSURLConnection*)con didSth{if(con != self.curCon) return;}