我有一个类“Compass”,它是另一个类“SensorA”,“SensorB”或“SensorC”的观察者。问题是我不知道运行前观察到的类。我使用反射为了在运行时创建一个实例。 我不知道在做这件事时我是否正确地练习KVO。运行前有未知观察对象的KVO
---Another Extern Class--- Compass *aCompass= [[AnalogCompass alloc] initWithCompassName:@"ABC" andID...]; ---The oberserving Compass.m Class--- - (id)initWithCompassName:(NSString *)CompassName andIid:(int)Iid showAnalog:(NSString *)ShowAnalog showDigital:(NSString *)ShowDigital { if (self = [super init]) { super.iid = Iid; super.CompassName = CompassName; showAnalog=ShowAnalog; showDigital=ShowDigital; Class unknown_cls; unknown_cls = [[NSClassFromString(super.CompassName) alloc]init]; [unknown_cls addObserver:self forKeyPath:showAnalog options:NSKeyValueObservingOptionNew context:NULL]; [unknown_cls addObserver:self forKeyPath:showDigital options:NSKeyValueObservingOptionNew context:NULL]; } } - (void) observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{ NSLog(@"IN?"); // [super observeValueForKeyPath:keyPath // // ofObject:object // // change:change // // context:context]; } ---Example of the oberserved SensorA Class--- @interface SensorA : NSObject { double xPosition; ... } @property (assign) double depthInFeet; - (id)initWithLineToParse:(NSArray *) fields; @end
当我正在做一个像 self.xposition = position; (SensorA,SensorB,SensorC),“observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context” in( )我的观察员指南针没有被调用。我猜测它与反射有关,也许与这种技术的相关限制有关。或者也许是因为反映
unknown_cls = [[NSClassFromString(super.CompassName) alloc]init];而不是
unknown_cls = [[NSClassFromString(super.CompassName) alloc]initWithLineToParse:array];
如何让我的工作? 这样的观察可能是错误的尝试吗?感谢帮助。
看起来像问题真的是反射,因为我不能调用任何函数,我该怎么做才能动态获取我的实例? – 2011-04-02 22:27:37
我只能从反射的Class实例中调用静态方法吗? – 2011-04-02 22:38:15
您将看到showAnalog的内存问题, showDigit一个实例变量。您正在使用简单分配来捕获参数值,但这不够好。您需要保留或复制参数值以正确管理实例变量内存。像showAnalog = [ShowAnalog copy]; – 2011-04-03 03:49:16