@interface aViewController: UIViewController { NSMutableArray *anArray; // 你需要稍后多次更改它。 } @end我在*.m文件中为其分配内存:
-(void) viewDidLoad { anArray = [[NSMutableArray alloc] init]; }我点击测试按钮来加载我的数组(最终每次单击都需要加载不同的值):
anArray = [NSMutableArray arrayWithObjects:@"one", @"two", @"three", nil];我在这里释放它:
-(void) dealloc { [anArray release]; [super dealloc]; }看起来一切都没问题吗?
因为当我稍后运行此代码时,它会崩溃:
NSLog(@"%d", [anArray count]);不确定为什么一个简单的“NSLog()和count”会导致一切崩溃。
Dirk,
让我这样说:我对指针、数组、字符串和内存有一个巨大的误解。
我已经阅读了我能找到的所有内容...但是(尚未)找到一个简单、清晰、易于理解的描述。
你能建议一个吗?(希望不超过10页的阅读量。) 有没有一个只解释这个主题的参考资料...从“你有12年的编程经验...但从未涉及分配内存或指针”的角度出发?
那么变量名不是我引用对象的方式吗? 那为什么还要有它呢?
我习惯了许多其他语言,只需要这样做:
myString = "this" myString = "that"
myInt = 5 myInt = 15
(还有什么比这更简单的呢。)
在我看来,这似乎是最简单的方法。 (而且它似乎有效。但这是真正正确的吗?)
不要初始分配任何内存给我的NSMutableArray。 不要重复重新分配任何内存。(当我改变数组的值时。) 不要重复释放它。(在我改变数组的值之前。) 不要在退出程序时释放它。
但是: 始终记得在最初分配(和重复分配)新值给我的anArray变量时使用RETAIN。
您没有使用以下代码加载数组: anArray = [NSMutableArray arrayWithObjects:@"one", @"two", @"three", nil]; 相反,您正在替换它为一个新实例,更糟糕的是:使用某个您无法控制的实体的引用拥有该实例的引用
哇。所以我可以有20个数组...都叫做相同的名称:anArray...它们都是不同的吗?(没有全局数组这样的东西吗?)
为了清除旧值,可能会用到removeAllObject方法。还有一些变异方法,可以一次添加多个值。所以...首先我要“删除所有对象”...然后我才能调用一个方法将所有新值重新添加。
anArray = [NSMutableArray arrayWithObjects:@“one”,@“two”,@“three”,nil]保留; 而不是使用alloc / init序列。
哇。 我以为没有分配空间就不能存储任何东西在数组中。
如果您真的打算替换整个数组,您可能希望考虑使用属性。如何使用属性?这样做的正确方式是什么:
anArray = [NSMutableArray arrayWithObjects:@“one”,@“two”,@“three”,nil]; anArray = [NSMutableArray arrayWithObjects:@“four”,@“five”,@“six”,nil];
就像我会做的那样:
x = 12; x = 24;
哇。 我真的完全误解了关于字符串,数组和内存的所有内容。我以为“简单的方法”是一次分配空间......使用可变数组......尽可能多地更改它......并一次释放它。
这样做的问题是,这个新数组没有被保留,
我认为旧数组会消失......然后可以使用新数组。 (但我想不是。)
此外,您有一个内存泄漏,因为您从未释放原始数组。
我认为旧数组不应该被释放......我没结束......我只是希望将其更改为包含我的新值。 (但我想不是。)
但是有一种方法是使用[anArray release];
所以我必须“保留”它......这样我才不会失去它? (不确定为什么会这样。直到我告诉它......在我的最后dealloc电话中。)
另一种可能更正确的修复方法是使用addObject:或addObjectsFromArray:NSMutableArray方法,而不是不断创建新数组。
我只想创建一个数组......并根据需要使用它。 我永远不想添加到数组中。 我要将其设置为我的新值。