我不明白您在使用基于单例模式的类的委托时遇到的问题。
您创建一个 NSMutableArray 来存储观察者并在发生任何事情时循环通知所有观察者。
- (void)addObserver(id<locationControllerDelegate> observer)
{
[observers addObject: observer];
}
- (void)notifyAll()
{
for (id<locationControllerDelegate> observer in observers)
{
[observer someMethod];
}
}
别忘了添加一个 removeObserver() 方法。
您可以简单地通过添加代表
[[MyClass sharedInstance] addObserver:self];
你的情况
[[LocationController locationmanager] addObserver:self];
基本示例
这里有一个非常基本的(无内存管理)代码示例,说明单例的工作原理。
协议:
委托协议.h
#import <Foundation/Foundation.h>
@protocol DelegateProtocol <NSObject>
- (void)someMethod;
@end
Singelton 类:
MySingelton.h
#import <Foundation/Foundation.h>
@protocol DelegateProtocol;
@interface MySingleton : NSObject{
NSMutableArray *observers;
}
+ (MySingleton *)sharedInstance;
- (void)addObserver:(id<DelegateProtocol>) observer;
- (void)notifyAll;
@end
MySingleton.m
#import "MySingleton.h"
#import "DelegateProtocol.h"
@implementation MySingleton
static MySingleton *sharedInstance;
- (id)init
{
self = [super init];
if (self) {
observers = [[NSMutableArray alloc] init];
}
return self;
}
+ (MySingleton *)sharedInstance
{
if (sharedInstance == NULL) {
sharedInstance = [[MySingleton alloc] init];
}
return sharedInstance;
}
- (void)addObserver:(id<DelegateProtocol>)observer
{
[observers addObject:observer];
}
- (void)notifyAll
{
for(id<DelegateProtocol> observer in observers) {
[observer someMethod];
}
}
@end
最后是使用 sharedInstance 的类。
SomeClass.h
#import <Foundation/Foundation.h>
#import "DelegateProtocol.h"
@interface SomeClass : NSObject <DelegateProtocol>
@end
SomeClass.m
#import "SomeClass.h"
#import "DelegateProtocol.h"
#import "MySingleton.h"
@implementation SomeClass
- (id)init
{
self = [super init];
if (self) {
}
return self;
}
- (void)someMethod
{
NSLog(@"Called from singleton!");
}
@end
还有一个将使用所有这些东西的主要方法:
main.m
#import <Foundation/Foundation.h>
#import "SomeClass.h"
#import "MySingleton.h"
int main (int argc, const char * argv[])
{
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
SomeClass *aClass = [[SomeClass alloc]init];
[[MySingleton sharedInstance] addObserver:aClass];
[[MySingleton sharedInstance] notifyAll];
[pool drain];
return 0;
}
你会看到 someMethod-Method 将在 notifyAll 上被调用。