我有一个实现协议的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时,这是有效的。我该如何解决这个问题?
谢谢!
答案 0 :(得分:0)
执行您要执行的操作应该没有问题(即,让非控制器类实例充当委托)。
当AppDelegate设置为侦听器,而不是我的模型对象ServerConnection时,这是有效的。
您的ServerConnection
类是否实施了LocationManagerDelegate
协议? (我的意思是实现而不是在其接口中声明它。)
检查负责调用委托方法LocationManager
)的LocationManagerUpdated:
方法并添加NSLog
跟踪,以便在尝试发送时检查委托对象是否已正确设置消息。
编辑:
ServerConnection* serverConnection = [[ServerConnection alloc] init];
[LocationManager sharedLocationSingleton].delegate = serverConnection;
[[LocationManager sharedLocationSingleton] getUsersLocation];
在您发表评论后,很明显该问题源于在堆栈变量中实例化serverConnection
而不是在属性中。
自it leads to retain cycles以来,将delegate
属性设为强属性的方法不正确。你需要做的是在类中定义一个strong
serverConnection
属性来执行上面粘贴的代码(app delegate?)。
如果您不介意我的皮疹,如果您将委托定义为强大的属性,那么您正在做的是通过添加隐藏第一个错误的第二个错误修复错误。
答案 1 :(得分:-1)
看起来serverConnection
没有保留在任何地方,因为delegate
属性被指定为weak
,所以它被释放并设置为nil。
检查getUsersLocation
方法,看看当您尝试拨打LocationManagerUpdated:withValue: