Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 为什么nsstring在另一个类中使用时会消失?_Objective C - Fatal编程技术网

Objective c 为什么nsstring在另一个类中使用时会消失?

Objective c 为什么nsstring在另一个类中使用时会消失?,objective-c,Objective C,在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班,我有: @proper

在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]  ];
classA是主要场景(cocos2d,但这并不重要)。一开始,我可以在标签中看到classA中的“无数据”一词,但当classB中的数据发生变化时,我看不到屏幕上标签的变化。这句话的意思是:“没有数据” 为什么呢? 为什么我丢失了数据?
如果我在classB中记录数据,在它在那里更改之后,我可以看到它不是null,并且它有新的值。获取此字符串的A中的B实例有问题。

当您将标签文本设置为
位所指向的字符串时,它正在存储对该字符串的引用。稍后当您更改
数据
时,它将创建一个新字符串,该字符串是
数据
指向的,但是
和标签仍具有原始指针,该指针正在查看原始字符串。您希望在
数据
发生更改时更新它们:

在这种情况下,有几种方法可以采用,但最简单的方法之一是观察
classBI
data
属性的变化,并在其变化时更新
位和标签:

[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;
    }
}

你必须在某个地方更新标签!设置一次不会自动将其“绑定”到b类的值。你在哪里更新标签?我不。。但它是一个指针——它不是“始终”获取值吗?不,它指向表示“无数据”的字符串。当您将数据设置为新字符串时,位仍然指向旧字符串。@lnafziger哇,但是指针的意义是什么?如果我指给你看,那么从现在开始无论你看哪里,我都能看到你所看到的或你指的。。如果你改变了,我也会改变吗?或者这不是标签的具体方式?您指向的是特定对象(在本例中是
NSString
)。通过这种方式,可以对同一对象进行多个引用。但是,任何指针都可以更改为另一个对象,并且不会自动更新所有其他指针。这就是你正在做的。现在,如果使用
NSMutableString
并具有指向它的指针,只要不替换整个对象,就可以修改可变字符串的内容,并且在使用另一个指针检查它时会反映出来。那是因为它是同一个物体。很好的回答,谢谢!但是我不明白,如果比特指向数据,那么从现在开始,数据指向哪里,比特也指向哪里,这就是指针不的问题?我得到通知,比特有新的值。但是标签仍然没有更改…您需要为标签创建另一个属性(类似于
bits
,但是
UILabel
),以便可以像以前一样创建它(但使用self.label而不是局部变量),然后从observeValueForKeyPath使用它,并像我在
label.text=bits中那样设置文本行。