@interface aViewController: UIViewController { NSMutableArray *anArray; // You will need to later change this many times. } @end
我为它的* .m文件分配内存:
-(void) viewDidLoad { anArray = [[NSMutableArray alloc] init]; }
我单击一个测试按钮来加载我的数组(最终它需要加载DIFFERNT值
每次点击):
anArray = [NSMutableArray arrayWithObjects:@"one",@"two",@"three",nil];
我在这里释放它:
-(void) dealloc { [anArray release]; [super dealloc]; }
这一切看起来都不错吗?
因为我以后运行此代码时崩溃:
NSLog(@"%d",[anArray count]);
不知道为什么一个简单的“NSLog()和count”会使一切崩溃.
短剑,
让我这样说吧:我对指针,数组,字符串和内存有很大的误解.
我已经阅读了我能在其上找到的所有内容……但是(还)要找到一个简单,清晰,易于理解的描述.
你能建议吗? (希望阅读不到10页.)
是否有一个参考资料解释了这个主题…并且从“你有12年的编码经验……但没有处理过分配内存或指针”的观点来看.)
所以变量名不是我引用对象的方式吗?
那为什么呢?
我已经习惯了许多其他语言:
myString = "this" myString = "that" myInt = 5 myInt = 15
(什么可以更简单.)
在我看来这样做是最简单的方法.
(而且它似乎有效.但这是真的正确吗?)
Don't alloc any memory for my NSMutableArray initially. Don't re-alloc any memory repeatedly. (When I change my array's values.) Don't release it repeatedly. (Before I change my array's values.) Don't release it when I exit the program. But: Always remember to use RETAIN when I initially assign (and repeatedly reassign) new values to my anArray variable.
You are not loading your array with
anArray = [NSMutableArray arrayWithObjects:@”one”,@”two”,@”three”,nil];
Instead,you are replacing it with a new instance,and worse: with an instance,whose
reference is actually owned by some entity you do not control
哇.所以我可以拥有20个数组……所有的名字都叫同一个名字:anArray ……它们会有所不同吗? (没有GLOBAL数组这样的东西?)
etc. In order to clear out old values,the method removeAllObject may be handy.
There are also mutation methods,which may be used to add multiple values at once.
所以……首先我必须“删除所有对象”……然后我可以调用ONE方法重新添加所有新值.
anArray = [[NSMutableArray arrayWithObjects:@”one”,nil] retain];
instead of the alloc/init sequence.
哇.我认为没有任何东西可以存储在数组中而不为它分配空间.
If you really intend to replace the entire array,you may want to consider
using properties
> anArray = [NSMutableArray arrayWithObjects:@"one",nil]; > anArray = [NSMutableArray arrayWithObjects:@"four",@"five",@"six",nil];
就像我会这样做:
x = 12; x = 24;
哇.我真的完全误解了字符串,数组和内存的一切.
我认为“简单方法”是分配ONCE …使用可变数组……根据需要更改它…并释放它.
The problem with doing so is that this new array isn’t retained,
我认为旧阵列将会消失……并且可以使用新阵列.
(但我猜不是.)
Further,you have a memory leak because you never freed the original array.
我当时认为旧阵列不应该被释放…我没有完成它…我只是想改变它以包含我的新值. (但我猜不是.)
but one is to use [anArray release];
我在想这会让我释放我分配的内存……(但我猜不是)……然后我必须重新分配更多的内存. (但我猜不是.)
anArray = [[NSMutableArray arrayWithObjects:@”one”,nil] retain];
所以我必须“保留”它…所以它不会从我身下消失?
(不知道为什么会这样.直到我告诉它……在我最后的dealloc电话中.)
Another,probably more correct way to fix it would be to use the addObject: or
addObjectsFromArray: NSMutableArray methods instead of constantly creating new arrays.
我只想创建一个数组……并且只是按照我的意愿使用它.
我从不想添加到阵列.我想将它设置为我的新值.
解决方法
anArray = [NSMutableArray arrayWithObjects:@"one",nil];
相反,你要用一个新实例替换它,更糟糕的是:对于一个实例,它的引用实际上是由你不控制的某个实体所拥有的(很可能是NSAutoreleasePool.)你正确拥有的引用,由你创建的引用
[[NSMutableArray alloc] init]
失去了,将被泄露.
而不是替换整个数组引用,而是使用例如addObject:like来改变你已经拥有的那个
[anArray addObject: @"one"] [anArray addObject: @"two"]
为了清除旧值,方法removeAllObject可能很方便.还有一些变异方法,可用于一次添加多个值.
或者,您可以使用已经使用的构造方法分配数组,但要小心保留它.在viewDidLoad中
anArray = [[NSMutableArray arrayWithObjects:@"one",nil] retain];
而不是alloc / init序列.
如果您真的打算更换整个阵列,您可能需要考虑使用properties而不是手动执行引用计数.