我有一些代码在xcode 4.6中正常运行。自从我升级到xcode 5后,一个部分无效。这不是错误的。非常奇怪的是完全相同的代码没有修改DOES在模拟器中工作,但不适用于设备。如果我在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.....
}
基本上没有改变模拟器中的ANYTHING,调试控制台打印出“可达性创建”,但在任何设备(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”。
所以基本上它创建了对象OK,但是一旦我在模拟器上测试它就有效,但是在设备上它是null。那一点我不明白。
但是,如果我将可达性对象更改为强指针,则模拟器继续工作并且设备也能正常工作 - 因为当我测试可达性对象时,它被设置并且调试控制台打印“可创建性”< / p>
我不明白该对象只有在具有弱指针的设备上创建时才能为null ...当然 a)模拟器和设备应该表现相同 b)我之前只创建了对象 - 如果我使用弱指针,它在设备上如何变为空?/
提前感谢!
答案 0 :(得分:3)
您发布的代码永远不会有效。
它在模拟器上工作的事实是模拟器不完美的本质,而不是它应该工作的反射。
编译器应该给你一个警告,即创建一个对象并将其保存到弱指针,它将立即释放。这就是ARC的工作方式。
使用本地强变量。一旦强变量超出范围,将由调用者决定是否应该保留对该对象的强引用。