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在执行我上面粘贴的代码的类中定义一个属性(应用程序委托?)。

如果您不介意我的鲁莽,如果您将委托定义为强属性,那么您所做的是通过添加隐藏第一个错误的第二个错误来修复错误。

于 2012-12-21T12:20:21.770 回答
-1

它看起来serverConnection没有保留在任何地方,并且因为delegate属性被指定为weak,所以它被释放并设置为 nil。

检查getUsersLocation方法并查看您尝试调用时委托是否为零LocationManagerUpdated:withValue:

于 2012-12-21T12:24:09.627 回答