1

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 になっていますか?/

前もって感謝します!

4

1 に答える 1