iOS - 将Model类设置为另一个Model类的委托

时间:2012-12-21 12:13:31

标签: iphone ios xcode model delegates

我有一个实现协议的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时,这是有效的。我该如何解决这个问题?

谢谢!

2 个答案:

答案 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:

时委托是否为零