可以设置为零而不是不同的东西
问题描述:
我认为我没有做完了解所有关于内存的东西,但是这是我的问题:可以设置为零而不是不同的东西
我有这将是一个视图定义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:]:消息发送到释放实例
答
看样子当您去更改值时,包含在nextView.idActual
中的CFString(NSString)已被释放。如果你可以发布更多的相关代码,这将有所帮助。我想idActual
宣布为@property(nonatomic,retain)
。当您尝试将新值设置为idActual
时,将调用该属性的setter方法(可能会自动生成setter)。 setter方法所做的第一件事是尝试比较旧值和新值 - 然后崩溃。
当setter方法尝试将新值与旧值进行比较时,由于旧值已被释放,所以会遇到麻烦。
在分配这些新值之前,您是否打电话给[nextView.idActual release]
?如果你是这样,注释掉这一行,看看是否能解决你的问题。自动生成的setter方法将为您释放旧值。
我可以在NSLog中打印它的值,但我无法修改它...为什么D: – CalixJumi
请添加更多关于您声明的idActual的详细信息。 – rjgonzo
这不是你所问的问题的原因,但是......这不是stringWithFormat:打算使用的方式。该字符串应该是一个printf样式的格式字符串,后跟变量,就像这个'[NSString stringWithFormat:@“%d words”,numWords]'。如果你有一个字符串,比如'@“1”',并且你想创建一个新的'NSString',你可以使用'[NSString stringWithString:@“1”]'。 –