【问题标题】:weak vs strong pointers behaving slightly differently in xcode 5弱指针与强指针在 xcode 5 中的行为略有不同
【发布时间】:2013-10-24 15:25:38
【问题描述】:

我有一些在 xcode 4.6 中运行良好的代码。因为我升级到 xcode 5 一个部分无法正常工作。它没有出错。非常奇怪的是,未经修改的完全相同的代码在模拟器中可以工作,但不能在设备上工作。如果我在 xcode 4.6 中编译相同的 coe,它确实可以在设备和模拟器上工作。

它使用数百万的可达性类。

我已经找到了这个问题,但是因为它可以在 xcode 5 中的模拟器上运行,我不明白。

基本上在一个按钮点击我检查可达性。

我有一个指向可达性对象的弱指针,我在按钮单击时设置它 - 下面的 sn-p

@interface settingsViewController ()
@property (weak,nonatomic) Reachability *reachable;
@end

....

//called on click
/ Checks if we have an internet connection or not
- (void)testInternetConnection
{
    self.reachable= [Reachability reachabilityWithHostname:@"www.google.com"];
if (self.reachable)
{
    NSLog(@"reachability created");

}
    else
    {
        NSLog(@"NO OBJECT");
    }
//do more stuff.....
}

基本上不更改模拟器中的任何内容,调试控制台会打印“可达性已创建”,但在任何设备(iPhone/ipad、IOS6/IOS7)上,调试控制台都会打印“NO OBJECT”

使用reachabilityWithHostname 创建对象的tony milions 代码如下

#pragma mark - class constructor methods
+(Reachability*)reachabilityWithHostname:(NSString*)hostname
{
    SCNetworkReachabilityRef ref = SCNetworkReachabilityCreateWithName(NULL, [hostname UTF8String]);
    NSLog(@"init1");
    if (ref) 
    {
        NSLog(@"init2");
        id reachability = [[self alloc] initWithReachabilityRef:ref];

#if __has_feature(objc_arc)
        NSLog(@"init with arc");

        return reachability;
#else
        NSLog(@"init no arc");

        return [reachability autorelease];
#endif

    }
    NSLog(@"cannot init");

    return nil;
}

在模拟器和设备上,调试控制台都按预期打印“init with arc”。

所以基本上它可以创建对象,但是一旦我在模拟器上测试它是有效的,但在设备上它是空的。那一点我不明白。

但是,如果我将可达性对象更改为强指针,则模拟器继续工作并且设备也能正常工作 - 因为当我测试可达性对象时,它被设置并且调试控制台打印“可达性创建”

我不明白该对象如何在仅在设备上使用弱指针创建后立即为空...当然 a) 模拟器和设备的行为应该相同 b) 我刚刚在前一行创建了对象 - 如果我使用弱指针,它是如何在设备上变为 null 的?/

提前致谢!

【问题讨论】:

    标签: ios xcode


    【解决方案1】:

    您发布的代码永远不会起作用。

    它在模拟器上工作的事实是模拟器不完美的产物,而不是反映它应该工作。

    编译器应该警告你创建一个对象并将它保存到一个弱指针,它将立即被释放。这就是 ARC 的工作原理。

    使用局部强变量。一旦强变量超出范围,将由调用者决定是否应保留对该对象的强引用。

    【讨论】:

    • 这当然是完全有道理的。没有强指针表示可以释放。
    • 愚蠢的,即 - 抱歉 - 添加评论时遇到问题.. 使用 xcode 4.6 中的弱指针编译代码并调试到同一设备的代码如何在 100% 的时间内完美运行,这真的很奇怪。当然,模拟器可以愉快地使用用 xcode 4.6 或 5 编译的弱指针。奇怪的是它在 xcode 5 之前的表现如何完美一致。我看不出改变编译器是如何改变任何东西的。指针还是变强了!
    猜你喜欢
    • 2013-03-07
    • 2011-07-19
    • 1970-01-01
    • 1970-01-01
    • 2014-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-25
    相关资源
    最近更新 更多