iOS5需要ARC的可达性版本

Posted

技术标签:

【中文标题】iOS5需要ARC的可达性版本【英文标题】:Need Reachability version for ARC in iOS5 【发布时间】:2011-10-17 16:56:27 【问题描述】:

ios5 中使用 Apple 的 Reachability 代码我得到一堆编译错误,如下所示。关于这里发生的事情有什么想法吗?我正在使用 ARC,所以我稍微编辑了标准代码以删除 autorelease/retainNSAutoReleasePool

架构 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的可达性版本的主要内容,如果未能解决你的问题,请参考以下文章

可达性 iOS 5.1 (iPad)

Xcode:使用情节提要的附加视图控制器上的可达性

防止在首次启动 iOS 时调用 AFNetworking 可达性状态

ASIHttpRequest 可达性版本

ios - 可达性通知多个警报

iOS5 SDK - ARC 和内存管理