xcode 4.6で問題なく動作していたコードがいくつかあります。xcode 5 にアップグレードしてから、1 つのセクションが機能しませんでした。エラーではありません。非常に奇妙なことに、変更を加えていないまったく同じコードがシミュレーターでは機能しますが、デバイスでは機能しません。xcode 4.6で同じcoeをコンパイルすると、デバイスだけでなくシミュレーターでも動作します。
tony millions 到達可能性クラスを使用します。
問題を追跡しましたが、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 を使用してオブジェクトを作成するトニー ミリオンズ コードは以下のとおりです。
#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」を出力します。
したがって、基本的にはオブジェクトを正常に作成しますが、シミュレーターでテストするとすぐに有効ですが、デバイスではnullです。そのビット私は理解していません。
しかし、到達可能性オブジェクトを強力なポインターに変更すると、シミュレーターは引き続き動作し、デバイスも同様に動作します-到達可能性オブジェクトをテストすると、設定され、デバッグコンソールに「到達可能性が作成されました」と出力されます
オブジェクトが弱いポインターを持つデバイス上でのみ作成されるとすぐに、オブジェクトがnullになる方法を理解していません...確かにa)シミュレーターとデバイスは同じように動作する必要がありますb)前の行でオブジェクトを作成したばかりです-方法弱いポインターを使用している場合、デバイス上で null になっていますか?/
前もって感謝します!