我有一個類「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