- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我在我的 *.h 文件中声明我的数组:
@interface aViewController: UIViewController{ NSMutableArray *anArray; // You will need to later change this many times.}@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() 和计数”会导致一切崩溃。
德克,
让我这样说吧:我对指针、数组、字符串和内存有巨大的误解。
我已经阅读了我能在上面找到的所有内容...但是(尚未)找到一个简单、清晰、易于理解的描述。
你能推荐一个吗? (希望少于 10 页阅读。)是否有解释只是这个主题的引用......并且从“你有 12 年的编码经验......但没有处理过分配内存或指针”的角度来看。)
所以变量名不是我引用对象的方式?那为什么要有呢?
我已经习惯了很多其他的语言:
myString = "this"myString = "that"myInt = 5myInt = 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……而且它们都不一样? (没有全局数组这样的东西吗?)
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", @"two", @"three", 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", @"two", @"three", nil];> anArray = [NSMutableArray arrayWithObjects:@"four", @"five", @"six", nil];
就像我会做的那样:
x = 12;x = 24;
哇。我真的完全误解了关于字符串、数组和内存的一切。我认为“简单的方法”是分配一次……使用可变数组……随心所欲地改变它……然后释放一次。
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", @"two", @"three", 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.
我只想创建ONE 数组...然后按我的意愿使用它。我从不想ADD 到数组。我想将其设置为我的新值。
最佳答案
你没有加载你的数组
anArray = [NSMutableArray arrayWithObjects:@"one", @"two", @"three", nil];
相反,您正在用一个新实例替换它,更糟糕的是:用一个实例,其引用实际上由您无法控制的某个实体拥有(很可能是一个 NSAutoreleasePool
)。您正确拥有,由
[[NSMutableArray alloc] init]
丢失,会被泄露。
不是替换整个数组引用,而是改变你已经拥有的那个,使用例如 addObject:
like
[anArray addObject: @"one"]
[anArray addObject: @"two"]
等为了清除旧值,removeAllObject
方法可能很方便。还有变异方法,可用于一次添加多个值。
或者,您可以使用您已经使用的构造方法分配数组,但要小心保留它。在 viewDidLoad
中执行
anArray = [[NSMutableArray arrayWithObjects:@"one", @"two", @"three", nil] retain];
而不是 alloc
/init
序列。
如果你真的打算替换整个数组,你可能要考虑使用 properties而不是手动进行引用计数。
关于objective-c - 声明、分配、加载和释放 NSMutableArray 的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2308053/
在 viewDidLoad 上,我的应用程序填充 NSMutableArray arrayOfHaiku,它是 NSDictionary 项的数组,如下所示: NSError *error; NS
我在 NSMutableArray 上是这样的: NSMutableArray *array = [NSMutableArray arrayWithObjects:@"0",@"0",@"0",@"0
我正在尝试设置我的 allArticlesArray 的内容,然后将附加对象附加到数组中。这是我的代码片段: [self.allArticlesArray setArray:newsArray]; [
我用 NSMutableArray 中的数据填充了 TableView ,一切正常。当我选择一个单元格(didSelectRowAtIndex)时,该项目将从数组中删除,正如它应该做的那样。现在我希望
我有一个 NSMutableArray 是我的代表,我也在我的一个 View Controller 中使用它。 所以在 viewDidLoad 我像这样制作我的 NSMutableArray 的可变副
我有 100 个元素的 NSMutableArray。 我想将“20 - 50”、“10 - 20”、“60 - 100”和 50 - 60. 元素加载到单独的 NSMutableArray 中,并将
关闭。这个问题需要details or clarity .它目前不接受答案。 想改进这个问题吗? 通过 editing this post 添加细节并澄清问题. 关闭 9 年前。 Improve t
我在尝试将字符串的 NSMutableArray 共享给另一个类时遇到了一些问题。我有一个 tableView,其中填充了 Strings,我想将其添加到 NSMutableArray。然后在另一个
正如我们所知,数组是一个连续的内存分配。那么 NSMutableArray 大小将如何增加。 最佳答案 C 数组确实使用连续内存,C++ std::vector 也是如此,但是 NSMutableAr
我需要对一个数组进行排序,里面有一个数组,像这样: NSMutableArray * array_example = [[NSMutableArray alloc] init]; [array_e
这看起来很简单,但我只是得到一个空数组。 我想获取一个按下的按钮,找到它旁边的所有按钮(参见代码中的注释),并将所有找到的按钮添加到另一个 NSMutableArray。 然后我想遍历该数组并对每个按
我正在尝试在另一个 NSMutableArray 中添加 NSMutableArray。但我想做的是嵌套数组。 我当前的代码是: NSMutableArray *array1 = [NSMutab
我有三个类,即DepartmentViewController、DepartmentRequest、Department。这就像我从 DepartmentViewcontroller 发出部门请求,并
我正在尝试将 NSMutableArray 存储在 NSMutableArray 中。所以 var all:NSMutableArray = NSMutableArray() let localArr
这一定是那些错误之一,您一直盯着代码看很长时间,以至于找不到错误。 我有这个代码块,我在其中循环遍历一个包含多个 NSMutableArray 的 NSMutableArray: // FoodVi
我有一个包含 50 个条目的 NSMutableArray - 有什么简单的方法可以将其分成 5 个 NSMutableArray,每个 10 个条目。 最佳答案 是的,要划分 NSMutableAr
我想将 NSMutableArray 的 addObject 放入 NSMutableArray 中,那么我如何快速实现这一点。并检索它,所以请帮助我,因为现在我正在快速学习。 间接说我要二维数组是指
好吧: 我有 NSMutableArray 1 我还有 NSMutableArray 2 我想从数组 1 中删除与数组 2 中的对象匹配的所有对象。 有什么想法吗? 最佳答案 我刚刚打开文档,打印 N
我正在尝试制作 NSMutableArray 的深拷贝,其对象是与此类似的自定义类的实例: @interface CustomParent : NSObject @property NSInteger
我知道你们可能会觉得这是一个重复的问题。但我对我的项目的这个问题搞砸了。 现在转到这个问题,我已经采取了NSMutableArray命名为 arr1包含字符串值,例如 @"34" , @"40"等等。
我是一名优秀的程序员,十分优秀!