在xcode 5中,弱指针和强指针的performance略有不同

我有一些代码在xcode 4.6中快乐地工作。 因为我升级到Xcode 5一节没有工作。 这不是错误。 非常奇怪的是,完全相同的代码没有修改在模拟器中工作,但不能在设备上工作。 如果我在xcode 4.6中编译相同的coe,它可以在设备和模拟器上工作。

它使用托尼百万个可达性类。

我已经追查到这个问题,但因为在Xcode 5模拟器itworks,我不明白。

基本上button点击我检查可达性。

我有一个弱指针可达性对象,我设置在button点击 – 片段下面

@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..... } 

基本上在不改变模拟器中的任何东西的情况下,debugging控制台打印“创build可达性”,但是在任何设备(iPhone / ipad,IOS6 / IOS7)上,debugging控制台打印“NO OBJECT”

东尼万代码使用reachabilityWithHostname创build对象如下

 #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; } 

并且在模拟器和设备上,debugging控制台按预期打印“带弧的初始化”。

所以基本上它创build的对象确定,但只要我在模拟器上testing它是有效的,但在设备上它是空的。 那一点我不明白。

但是,如果我改变可达性对象是一个强大的指针,模拟器继续工作,设备工作以及 – 当我testing可达性对象,它被设置和debugging控制台打印“可达性创build”

我不明白如何对象可以为空,只要在弱指针的设备上创build…当然a)模拟器和设备应该行为相同b)我只是刚才创build的对象之前 – 如何如果我使用弱指针,它在设备上变为空?

提前致谢!

你发布的代码不应该工作。

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

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

使用本地强variables。 一旦强variables超出范围,则由调用者决定是否应该保留对该对象的强烈参考。