0

プロトコルを実装する CLLocationManager シングルトンがあるので、ユーザーの更新された場所が見つかったことを別のモデル クラス (ServerConnection) に伝えることができます。

メソッドの AppDelegate で、didFinishLaunching を書きます。

ServerConnection* serverConnection = [[ServerConnection alloc] init];
[LocationManager sharedLocationSingleton].delegate = serverConnection;
[[LocationManager sharedLocationSingleton] getUsersLocation];

これは機能せず、ServerConnection クラスのデリゲート メソッドが呼び出されません。ただし、次の行のように AppDelegate クラスをリスナーにしようとすると、正常に動作します。

// self refers to AppDelegate
[LocationManager sharedLocationSingleton].delegate = self;

ここで、私の AppDelegate は必要なデリゲート メソッドを実装し、ユーザーの場所が更新されるとメソッドが呼び出されます。

デリゲートを serverConnection に設定しようとすると、上記のメソッドが失敗するのはなぜですか?

オンラインのチュートリアルでは、通常、UIViewController または AppDelegate を「リスナー」として使用することを示していますが、私の場合は、別のモデル クラスをリスナーにしたいと考えています。それ、どうやったら出来るの?

以下は、プロトコルを使用した LocationManager シングルトン クラスです。

@class LocationManager;

@protocol LocationManagerDelegate <NSObject>
@required
-(void)LocationManagerUpdated:(LocationManager*) locationManager
                  withValue:(CLLocation*) location;
@end

@interface LocationManager : NSObject <CLLocationManagerDelegate>

@property (strong, nonatomic) CLLocationManager* locationManager;
@property (strong, nonatomic) CLLocation* location;
@property (weak, nonatomic) id <LocationManagerDelegate> delegate;

+(LocationManager*)sharedLocationSingleton;
-(void) getUsersLocation;

@end

サーバー接続用の私のヘッダーファイルは.

#import <Foundation/Foundation.h>
#import "LocationManager.h"

@interface ServerConnection : NSObject <LocationManagerDelegate>
@end

これは、AppDelegate がリスナーに設定されている場合に機能しますが、モデル オブジェクトの ServerConnection には機能しません。これを修正するにはどうすればよいですか?

ありがとう!

4

2 に答える 2

0

やろうとしていること (つまり、デリゲートとして機能する非コントローラー クラス インスタンスを持つこと) を行うことに問題はないはずです。

これは、AppDelegate がリスナーに設定されている場合に機能しますが、モデル オブジェクトの ServerConnection には機能しません。

あなたのServerConnectionクラスはLocationManagerDelegateプロトコルを実装していますか? (インターフェイスで宣言するのではなく、実装することを意味します)。

LocationManagerデリゲート メソッドの呼び出しを担当するメソッド ( ) を確認し、LocationManagerUpdated:そこにトレースを追加NSLogして、メッセージを送信しようとしたときにデリゲート オブジェクトが正しく設定されていることを確認します。

編集:

ServerConnection* serverConnection = [[ServerConnection alloc] init];
[LocationManager sharedLocationSingleton].delegate = serverConnection;
[[LocationManager sharedLocationSingleton] getUsersLocation];

コメントした後、問題serverConnectionがプロパティではなくスタック変数でインスタンス化することに起因することは明らかです。

delegateプロパティを強力なプロパティにするアプローチは、保持サイクルにつながるため正しくありません。あなたがする必要があるstrong serverConnectionのは、上に貼り付けたコードを実行するクラスでプロパティを定義することです (アプリ デリゲート?)。

デリゲートを強力なプロパティとして定義すると、最初のバグを隠す 2 番目のバグを追加してバグを修正することになります。

于 2012-12-21T12:20:21.770 に答える
-1

serverConnectionはどこにも保持されていないようで、delegateプロパティが と指定されているためweak、解放されて nil に設定されます。

メソッドをチェックgetUsersLocationし、呼び出そうとしている時点でデリゲートが nil かどうかを確認しますLocationManagerUpdated:withValue:

于 2012-12-21T12:24:09.627 に答える