2011-09-05 39 views
0

我认为我没有做完了解所有关于内存的东西,但是这是我的问题:可以设置为零而不是不同的东西

我有这将是一个视图定义idActual变量推(var在其标题中定义),我可以读取(NSLog(idActual))并将其设置为零而没有问题。但当我改变它的价值,我得到一个CFString错误,它应该是由于不良的内存管理,我试过这个:

我可以这样做:nextView.idActual = nil;

我不能做到这一点:

a) nextView.idActual = @"1"; 

b) NSString *str = [NSString stringWithFormat:@"1"]; 
    nextView.idActual = str; 

c) NSString *str = [[NSString alloc] initWithFormat:@"1"]; 
    nextView.idActual = str; 
    [str release]; 

的a,b和c总是给我CFString字符串错误: *** - [CFString字符串isEqualToString:]:消息发送到释放实例

+0

我可以在NSLog中打印它的值,但我无法修改它...为什么D: – CalixJumi

+0

请添加更多关于您声明的idActual的详细信息。 – rjgonzo

+0

这不是你所问的问题的原因,但是......这不是stringWithFormat:打算使用的方式。该字符串应该是一个printf样式的格式字符串,后跟变量,就像这个'[NSString stringWithFormat:@“%d words”,numWords]'。如果你有一个字符串,比如'@“1”',并且你想创建一个新的'NSString',你可以使用'[NSString stringWithString:@“1”]'。 –

回答

0

看样子当您去更改值时,包含在nextView.idActual中的CFString(NSString)已被释放。如果你可以发布更多的相关代码,这将有所帮助。我想idActual宣布为@property(nonatomic,retain)。当您尝试将新值设置为idActual时,将调用该属性的setter方法(可能会自动生成setter)。 setter方法所做的第一件事是尝试比较旧值和新值 - 然后崩溃。

当setter方法尝试将新值与旧值进行比较时,由于旧值已被释放,所以会遇到麻烦。

在分配这些新值之前,您是否打电话给[nextView.idActual release]?如果你是这样,注释掉这一行,看看是否能解决你的问题。自动生成的setter方法将为您释放旧值。

+0

大声笑我解决了它,它与该代码块无关,但我认为这是由于,但没有...它是一个varA = anyObject的问题,它通过self.varA = anyObject解决,我永远不会明白 – CalixJumi

+0

,因为如果你不使用self.variable = other你没有利用综合属性(它调用保留或复制在幕后)。如果你只做myvar = other,其他的不会被保留。 –

+0

ohhhhhhhhhh,澄清everythin:D! (好吧,这一周让我头痛的最后一步)非常感谢你! – CalixJumi

相关问题