在类A中,我有:
classB *classBI=[[classB alloc]init];
bits=[classBI data]; //bits has a property here in classA,it gets data from B/
UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(38.f, 20.f, 244.f, 43.f)];
label.text = bits;
在B类中,我有:
@property (nonatomic,retain) NSString *data; //in .h file
data=@"no data"; //at the init method of classB .
//then after a while when something is happen in classB , data is changed to :
data=[NSString stringWithFormat:@"data:%f,%f,%f,%f,%f,%f",
dataBits[0],dataBits[1],dataBits[2],dataBits[3],dataBits[4],dataBits[5] ];
类A是主要场景(cocos2d,但没关系)。 一开始,我真的可以在标签中看到A类中的"无数据"一词,但是当B类中的数据发生变化时,我在屏幕上的标签中看不到这种变化。 它保留了这个词:"没有数据"为什么?为什么我丢失了数据?如果我在B类中NSLOG数据,在它在那里更改之后,我可以看到它不为空,并且它具有新值。获取此字符串的 A 中的 B 实例有问题。
标签的文本设置为 bits
指向的字符串时,它将存储对该字符串的引用。 稍后当您更改data
时,它会创建一个data
指向的新字符串,但bits
和标签仍然具有查看原始字符串的原始指针。 您希望在更改data
时更新它们:
在这种情况下,有几种方法可以采用,但最简单的方法之一是观察 classBI
的 data
属性进行更改,并在更改时更新bits
和标签:
[classBI addObserver:self
forKeyPath:@"data"
options:NSKeyValueObservingOptionNew
context:NULL];
然后,每当数据更改时,将调用此方法:
// Note that you will need to get a reference to 'label' in order for this to work:
- (void) observeValueForKeyPath:(NSString*)keyPath ofObject:(id)object change:(NSDictionary*)change context:(void*)context {
if ([keyPath isEqual:@"data"]) {
bits = [change objectForKey:NSKeyValueChangeNewKey];
label.text = bits;
}
}