需要iOS5中适用于ARC的Reachability版本

32
在iOS5中使用苹果的可达性代码,我遇到了一堆编译错误,如下所示。这是怎么回事?我正在使用ARC,因此我稍微编辑了标准代码,以删除autorelease/retain NSAutoReleasePool

架构armv7的未定义符号:

"_SCNetworkReachabilityCreateWithAddress",引用自: +[Reachability reachabilityWithAddress:] in Reachability.o

"_SCNetworkReachabilityCreateWithName",引用自: +[Reachability reachabilityWithHostName:] in Reachability.o

"_SCNetworkReachabilityUnscheduleFromRunLoop",引用自: -[Reachability stopNotifier] in Reachability.o

"_SCNetworkReachabilityScheduleWithRunLoop",引用自: -[Reachability startNotifier] in Reachability.o

"_SCNetworkReachabilitySetCallback",引用自: -[Reachability startNotifier] in Reachability.o

"_SCNetworkReachabilityGetFlags",引用自: -[Reachability connectionRequired] in Reachability.o -[Reachability currentReachabilityStatus] in Reachability.o

ld:找不到符号(对于架构armv7)。clang:错误:链接器命令失败,退出代码为1(使用-v查看调用)

有没有人有适用于iOS5下ARC的可达性代码?


4
你可以关闭一些文件的自动引用计数(ARC)。查看此答案: https://dev59.com/km015IYBdhLWcg3w7wQW#6429909 - JSanchez
所有这些答案,大多数如果不是全部都是完全有效的,但您还没有将其中一个标记为正确? - theiOSDude
8个回答

59

从你的代码中我看到 isReachableViaWWAN 在 iPad 上自动返回 NO。那么在启用 3G 的 iPad 上该怎么工作呢? - Nailer
2
你是错误的,当编译为iPad时,TARGET_OS_IPHONE被定义,因此它将在iPad上正确返回 - 当编译为MacOS时,它将自动返回NO,因为它没有kSCNetworkReachabilityFlagsIsWWAN标志。如果您检查SCNetworkReachability.h,您会发现它被包含在相同的#if语句中。 - Tony Million
我的错。我不知道TARGET_OS_IPHONE在iPad上也被定义了。名称有点混淆。不管怎样,它运行得很好!谢谢 =)我猜这个定义是iOS之前的遗留问题。 - Nailer
非常好的工作,Tony!README 没有提到需要将 dispatch_async() 返回到主线程(尽管您的示例项目这样做了)。我已经列出了一个常见用例,并为其他读者包含了一个充满注释的要点:https://gist.github.com/2568090 - idStar
3
你好,你的Gist完全错误。如果您只需要定期检查连接性,则不需要通知程序代码,您可以在临时基础上简单测试可达性。如果您需要通知以了解网络连接状态何时更改(例如在即时消息客户端中),则需要使用通知程序。该代码已记录以让用户知道块未在主线程上调用。 - Tony Million
1
例如,以下代码就足够了 [[Reachability reachabilityWithHostname:kRPWebsite_REPSPRO] isReachable]; - Tony Million

44

您实际上不需要一个ARC版本的Reachability,只需简单地禁用reachability文件的ARC即可。

在多个文件上禁用ARC:

  • 在Xcode的Target/Build Phases/Compile Sources中选择所需的文件
  • 按Enter键
  • 输入-fno-objc-arc
  • 按Enter或Done

您还缺少一个框架。请添加 SystemConfiguration framework


太棒了!!!你能帮我找到学习“-fno-objc-arc”所有相关内容的地方吗?苹果是否列出了所有编译器标志?我认为这是每个高级程序员都应该学习的东西! - Albert Renshaw
@AlbertRenshaw 这肯定在文档中某个地方有提到,但是通过谷歌搜索会快得多。 - Tibidabo
http://developer.apple.com/library/mac/#documentation/DeveloperTools/Reference/XcodeBuildSettingRef/1-Build_Setting_Reference/build_setting_ref.html - Albert Renshaw
非常全面的列表... 但是,它没有列出你的-fno-objc-arc - Albert Renshaw
我刚刚在我的项目中尝试了这个方法,但是没有任何改变。 "转换为Objective-C ARC" 仍然抱怨 Reachability.m 文件中的同一行代码。 - CasaDelGato

11

感谢您的评论。在我添加了 SystemConfiguration.framework 之前,我仍然遇到了符号引用错误。 - caleb

10

7

3
你需要添加systemConfiguration.framework才能让Reachability正常工作。

2

我知道这个帖子已经很老了,但如果有人感兴趣,可以通过禁用Reachability.m文件的ARC来解决这个问题。 查看此帖子


1
Tony,即使是非ARC项目,你的类是否能够正常工作? 我在控制台中看到了很多“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; 
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接