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