我有一些在 xcode 4.6 中运行良好的代码。因为我升级到 xcode 5 一个部分无法正常工作。它没有出错。非常奇怪的是,未经修改的完全相同的代码可以在模拟器中工作,但不能在设备上工作。如果我在 xcode 4.6 中编译相同的 coe,它确实可以在设备和模拟器上工作。
它使用数百万可达性类。
我已经找到了这个问题,但是因为它可以在 xcode 5 中的模拟器上运行,我不明白。
基本上在一个按钮上单击我检查可达性。
我有一个指向可达性对象的弱指针,我在按钮单击时设置它 - 下面的片段
@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)我只是在之前的行中创建了对象 - 如何如果我使用弱指针,它是否在设备上变为空?/
提前致谢!