Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 声明、分配、加载和释放NSMutableArray的正确方法_Objective C_Iphone_Nsmutablearray_Dealloc - Fatal编程技术网

Objective c 声明、分配、加载和释放NSMutableArray的正确方法

Objective c 声明、分配、加载和释放NSMutableArray的正确方法,objective-c,iphone,nsmutablearray,dealloc,Objective C,Iphone,Nsmutablearray,Dealloc,我在*.h文件中声明我的数组: @interface aViewController: UIViewController { NSMutableArray *anArray; // You will need to later change this many times. } @end @界面aViewController:UIViewController { NSMUTABLEARRY*anArray;//以后需要多次更改此选项。 } @结束 我为它分配内存我的*.m文件: -(

我在*.h文件中声明我的数组:

@interface aViewController: UIViewController { NSMutableArray *anArray; // You will need to later change this many times. } @end @界面aViewController:UIViewController { NSMUTABLEARRY*anArray;//以后需要多次更改此选项。 } @结束 我为它分配内存我的*.m文件:

-(void) viewDidLoad { anArray = [[NSMutableArray alloc] init]; } -(无效)viewDidLoad { anArray=[[NSMutableArray alloc]init]; } 我单击一个测试按钮来加载我的数组(最终它将需要加载不同的值) 每次单击时):

anArray=[NSMutableArray数组,其对象为:@“一”,“二”,“三”,零]; 我把它放在这里:

-(void) dealloc { [anArray release]; [super dealloc]; } -(无效)解除锁定 { [阵列释放]; [super dealoc]; } 这些看起来都好吗

因为我以后运行此代码时它崩溃:

NSLog(@"%d", [anArray count]); NSLog(@“%d”,[anArray count]); 不知道为什么一个简单的“NSLog()和count”会使一切崩溃


德克

让我这样说:我对指针、数组、字符串和内存有很大的误解

我已经读了所有我能在上面找到的东西。。。但(尚未)找到一个简单、清晰、易于理解的描述

你能推荐一个吗?(希望不到10页的阅读。) 有没有参考资料可以解释这个主题。。。从“你有12年的编码经验……但从来没有人处理过分配内存或指针”的观点来看

那么变量名不是我引用对象的方式? 那为什么有它呢

我已经习惯了许多其他的语言,它们都能做到这一点:

myString = "this" myString = "that" myInt = 5 myInt = 15 myString=“这个” myString=“那” myInt=5 myInt=15 (还有更简单的办法。)


在我看来这是最简单的方法。 (这似乎有效,但确实正确?)

最初不要为我的NSMutableArray分配任何内存。 不要重复分配任何内存。(当我更改数组的值时。) 不要重复释放它。(在更改数组值之前。) 当我退出程序时不要释放它。 但是: 在最初分配时,请始终记住使用RETAIN (并反复重新分配)新值到我的anArray变量。

您没有使用加载数组 anArray=[NSMutableArray数组,其对象为:@“一”,“二”,“三”,零]; 相反,您正在用一个新实例替换它,更糟糕的是:用一个 引用实际上由您不控制的某个实体拥有

哇。所以我可以有20个数组。。。都叫同一个名字:anArray。。。他们会完全不同吗?(不存在全局数组吗?)

为了清除旧值,removeAllObject方法可能很方便。 还有变异方法,可以用来一次添加多个值

所以。。。首先,我必须“移除所有对象”。。。然后我可以调用一个方法,它可以重新添加我所有的新值

anArray=[[NSMUTABLEARRY ARRAY WITH OBJECTS:@“一”,“二”,“三”,零]保留]; 而不是alloc/init序列

哇。我认为如果不为数组分配空间,任何东西都不能存储在数组中

如果您真的打算替换整个数组,您可能需要考虑 使用属性

我如何使用属性来实现这一点?
这样做的正确方法是什么:

> anArray = [NSMutableArray arrayWithObjects:@"one", @"two", @"three", nil]; > anArray = [NSMutableArray arrayWithObjects:@"four", @"five", @"six", nil]; >anArray=[NSMutableArray数组,其对象为:@“一”,“二”,“三”,零]; >anArray=[NSMutableArray数组,其对象为:@“四”,“五”,“六”,零]; 就像我会做的那样:

x = 12; x = 24; x=12; x=24;
哇。我真的完全误解了关于字符串、数组和内存的一切。 我认为“简单的方法”是分配一次。。。使用可变数组。。。你想怎么改就怎么改。。。释放它一次

这样做的问题是没有保留这个新阵列

我想旧的阵列会消失。。。可以使用新阵列。 (但我想不是。)

此外,由于从未释放原始阵列,因此存在内存泄漏

我在想旧的阵列不应该被释放。。。我还没做完。。。我只是想把它改成包含我的新值。(但我想不是。)

但其一是使用[无序释放]

我想这会让我释放我分配的内存。。。(但我想不是)。。。然后我必须重新分配更多的内存。(但我想不是。)

anArray=[[NSMUTABLEARRY ARRAY WITH OBJECTS:@“一”,“二”,“三”,零]保留]

所以我必须“保留”它。。。所以它不会从我身上消失? (不知道为什么。直到我在最后一次dealloc电话中告诉它。)

另一种可能更正确的修复方法是使用addObject:or addObjectsFromArray:NSMutableArray方法,而不是不断创建新数组

我只想创建一个数组。。。我想怎么用就怎么用。
我永远不想添加到数组中。我想将其设置为我的新值。

您没有使用

anArray = [NSMutableArray arrayWithObjects:@"one", @"two", @"three", nil];
相反,您正在用一个新实例替换它,更糟糕的是:使用一个实例,它的引用实际上由您不控制您正确拥有的引用(很可能是
NSAutoreleasePool
)的某个实体所拥有,该实体由您创建

[[NSMutableArray alloc] init]
已经丢失,将被泄露

与其替换整个数组引用,不如使用
addObject:
like对您已有的数组引用进行变异

[anArray addObject: @"one"]
[anArray addObject: @"two"]
等。为了清除旧值,方法
removeAllObject
可能很方便。还有变异方法,可以用来一次添加多个值

或者,可以使用已经使用的构造方法分配阵列,但要小心保留它。在
viewDidLoad
do中

anArray = [[NSMutableArray arrayWithObjects:@"one", @"two", @"three", nil] retain];
而不是
alloc
/
init
序列


如果你真的打算替换整个数组,你可能需要考虑使用而不是手工做引用计数。

< P>问题是:代码> ANDALL= [NSMutabRayLayAdayObjult:@一个],“两个”,“三”,nIL];<代码>这将替换您初始化的数组
[anArray addObject: @"one"]
[anArray addObject: @"two"]
anArray = [[NSMutableArray arrayWithObjects:@"one", @"two", @"three", nil] retain];
string = [[NSString alloc] init];
string = [[NSString alloc] initWithString: @"Hello, World!"];
string = [[NSMutableString alloc] initWithString: @"Initial string"];
[string setString: @"Modified string"];
string = [[NSMutableString alloc] initWithString: @"Initial string"];
string = @"Modified string";
int1 = 4;
int1 = 5;
NSString *string;
int int1;
NSArray *myArray = [NSArray arrayWithObjects: @"Butter", @"Milk", @"Honey", nil];