iOS5需要ARC的可达性版本
Posted
技术标签:
【中文标题】iOS5需要ARC的可达性版本【英文标题】:Need Reachability version for ARC in iOS5 【发布时间】:2011-10-17 16:56:27 【问题描述】:在 ios5 中使用 Apple 的 Reachability 代码我得到一堆编译错误,如下所示。关于这里发生的事情有什么想法吗?我正在使用 ARC,所以我稍微编辑了标准代码以删除 autorelease/retain
和 NSAutoReleasePool
。
架构 armv7 的未定义符号:
“_SCNetworkReachabilityCreateWithAddress”,引用自: +[ReachabilityreachabilityWithAddress:] 在 Reachability.o
“_SCNetworkReachabilityCreateWithName”,引用自: +[ReachabilityreachabilityWithHostName:] 在 Reachability.o
“_SCNetworkReachabilityUnscheduleFromRunLoop”,引用自: -Reachability.o 中的[Reachability stopNotifier]
“_SCNetworkReachabilityScheduleWithRunLoop”,引用自: -Reachability.o中的[Reachability startNotifier]
“_SCNetworkReachabilitySetCallback”,引用自: -Reachability.o中的[Reachability startNotifier]
“_SCNetworkReachabilityGetFlags”,引用自: -Reachability.o 中的[Reachability connectionRequired] -Reachability.o中的[Reachability currentReachabilityStatus]
ld:未找到架构 armv7 clang 的符号:错误:链接器 命令失败,退出代码为 1(使用 -v 查看调用)
有没有人在 iOS5 下有可行的 ARC 可达性代码?
【问题讨论】:
您可以对某些文件关闭 ARC。看这个答案***.com/questions/6308425/… 所有这些答案,如果不是全部的话,大部分都是完全有效的,但您还没有将其中一个标记为正确? 【参考方案1】:我为 ARC 和 iOS5 编写了一个干净的“插入”版本的可达性 - 你可以在这里获得它:https://github.com/tonymillion/Reachability
【讨论】:
查看您的代码我看到 isReachableViaWWAN 在 iPad 上自动返回 NO。这如何与支持 3g 的 iPad 配合使用? 你错了,它会在 iPad 上正确返回,因为 TARGET_OS_IPHONE 是在为 iPad 编译时定义的 - 在为 MacOS 编译时它会自动返回 NO,因为它没有 kSCNetworkReachabilityFlagsIsWWAN 标志。如果您检查 SCNetworkReachability.h,您会看到它包含在同一个 #if 语句中。 我的错。我不知道 TARGET_OS_IPHONE 是在 iPad 上定义的。令人困惑的名字和所有。无论如何,它工作得很好!谢谢 =) 我猜这个定义是 iOS 之前的遗留问题。 您好,您的要点是完全错误的,如果您只需要定期检查连接,您不需要通知程序代码,您可以简单地临时测试可访问性。如果您需要通知以了解网络连接状态何时发生变化(例如在 IM 客户端中),那么您将使用通知程序。记录代码以让用户知道这些块没有在主线程上调用。 例如下面的代码就足够了 [[ReachabilityreachabilityWithHostname:kRPWebsite_REPSPRO] isReachable];【参考方案2】:您实际上并不需要 ARC 版本的可达性,只需为可达性文件禁用 ARC
在多个文件上禁用 ARC:
在 Xcode 中的 Target/Build Phases/Compile Sources 选择所需文件 按回车 键入 -fno-objc-arc 按 Enter 或完成您还缺少一个框架。添加 SystemConfiguration 框架。
【讨论】:
太棒了!!!!你能帮我找出在哪里学习所有“-fno-objc-arc”这些东西吗? Apple 是否列出了所有编译器标志?我认为这是每个高级程序员都应该学习的东西! @AlbertRenshaw 它一定在文档的某个地方,但是用谷歌搜索要快得多。 developer.apple.com/library/mac/#documentation/DeveloperTools/… ^非常广泛的列表...但是,它没有列出您的-fno-objc-arc
我刚刚在我的项目中尝试过这个 - 并没有任何区别。 “转换为 Objective-C ARC”仍然抱怨 Reachability.m 文件中的同一行。【参考方案3】:
我rearranged them for IOS 5 and arc他们正在工作测试
请不要忘记在您的项目中添加 SystemConfiguration.framework
【讨论】:
感谢您的评论。在添加 SystemConfiguration.framework 之前,我仍然收到那些符号引用错误。【参考方案4】:我刚刚发现这可能会有所帮助。感谢作者(这不是我的)!
https://gist.github.com/1182373
【讨论】:
【参考方案5】:Apple 的可达性已更新至版本 3,现在支持 ARC iOS5+
Here is the link to the sample by Apple
【讨论】:
【参考方案6】:您需要添加 systemConfiguration.framework 以使 Reachability 工作。
【讨论】:
【参考方案7】:我知道这个帖子很旧,但如果有人感兴趣,您可以通过禁用 ARC for Reachability.m 来解决这个问题。 Look at this post.
【讨论】:
【参考方案8】:Tony,即使使用非 ARC 项目,您的课程也能正常工作吗? 我可以在控制台中看到很多 ok Reachability: dealloc ,我不知道这是否正常! 我用这种方法检查连接(是我唯一使用 Rechability 的地方)
-(BOOL)checkConnection
BOOL connessione = FALSE;
Reachability *wifiResouce = [[Reachability reachabilityForLocalWiFi] retain];
Reachability *phoneResouce = [[Reachability reachabilityForInternetConnection] retain];
NetworkStatus netStatusWiFi = [wifiResouce currentReachabilityStatus];
NetworkStatus netStatusPhone = [phoneResouce currentReachabilityStatus];
if(netStatusWiFi == NotReachable)
if(netStatusPhone == ReachableViaWWAN)
connessione = TRUE;
else if(netStatusWiFi == ReachableViaWiFi)
connessione = TRUE;
[phoneResouce release];
[wifiResouce release];
return connessione;
【讨论】:
以上是关于iOS5需要ARC的可达性版本的主要内容,如果未能解决你的问题,请参考以下文章