NSMutableArray里

时间:2009-08-26 15:08:09

标签: iphone objective-c

我有NSMutableArray作为班级的成员变量。

.h文件中:

@interface bleh {
NSMutableArray *list;
}

@property (readonly, assign) NSMutableArray *list;

@end

.m文件中:

@implementation bleh
@synthesize list;
-(void)init;
{
    list = [NSMutableArray arrayWithCapacity:30];
}
@end

现在,我不是一个客观的C程序员,所以也许我错过了一些细微差别,但是当我做以下事情时:

NSMutableString *listItem = [NSMutableString stringWithString:@"Foobar"];
[list addObject:listItem];

我的行为很奇怪。也就是说,我正在使用它来保存我最终想要附加到电子邮件的文件列表,然后打开选择器。我得到一个SIGABRT,经过调试,我发现每当我在列表上操作时,我什么都没得到。 addObject消息根本不会增加NSMutableArray的大小。

我错过了什么吗?有人可以向我展示在Objective C中设置NSMutableArray在一个类中操作的完整实现吗?

感谢。

PS - 假设我足够聪明,可以将NSMutableArray的操作放在包含成员变量的类的成员函数内。

8 个答案:

答案 0 :(得分:4)

最新版本的SDK arrayWithCapacity中的

是不好的做法。 但是在你的代码中你创建了一个没有人是所有者的数组,正确地压缩你的数组。

不要忘记初始化你的数组

NSMutableArray *array = [[NSMutableArray alloc] init];

修复(只读,分配),

答案 1 :(得分:3)

你是如何实际创建阵列的?它有可能被自动释放并消失吗?请记住,如果您使用便捷方法(例如array或其他内容)创建它,则需要retain

答案 2 :(得分:3)

您正在使用arrayWithCapacity:创建数组,该数组返回您不拥有的数组,并且您永远不会声明拥有它的所有权。使用属性访问器来保留数组:

self.list = [NSMutableArray arrayWithCapacity:30];

我建议您阅读Cocoa memory management docs。一旦你知道那里的规则,就会清楚在这种情况下该怎么做。它们并不是很难,但如果你要编写Cocoa,它们是非常必要的。

答案 3 :(得分:3)

您的list变量已被自动释放并取消分配,因此当您尝试访问时,您的程序会崩溃。

在Cocoa中有两种创建对象的方法:

NSMutableArray* array1 = [[NSMutableArray alloc] initWithCapacity:10];
NSMutableArray* array2 = [NSMutableArray arrayWithCapacity:10];

array1是使用alloc + init创建的,因此您拥有它。它会一直存在,直到你release为止。

array2未使用alloc + init创建,因此您不拥有它。你没有责任释放它,但它会自行消失。如果您希望保留array2,则必须保留{{1}}。

答案 4 :(得分:3)

您的list财产声明阻止您正确保留NSMutableArray。通过调用arrayWithCapacity,您可以有效地将数组放入自动释放池中,这意味着如果没有任何对象可以保留它,则可以随时取消分配。虽然你是,你宣布的事情的方式并没有反映出:

@property (readonly, assign) NSMutableArray *list;

上面的声明只是将此指针设置为另一个指针的副本 - 它不会为您进行内存管理。相反它应该是:

@property (readonly, retain) NSMutableArray *list;

...您应该像这样分配列表:

self.list = [NSMutableArray arrayWithCapacity:64];

因为您为属性指定了retain属性,所以无论何时为其分配新值,retain消息都将发送到该新值,并与您不想要的内存管理器进行通信此对象已取消分配。为了实现这个完整的循环,当您释放包含类时,您需要release该对象:

- (void)dealloc
{
    [list release];
    [super dealloc];
}

答案 5 :(得分:1)

您是否正确初始化了列表?即你的代码中有类似的东西吗?

list = [[NSMutableArray alloc] init];

答案 6 :(得分:1)

问题ehre(假设您正确地启动了数组)可能是@"Foobar"确定NSString而不是NSMutableString因此失败,因为如果你应该做不同的类型

 NSMutableString *listItem = [NSMutableString stringWithString:@"Foobar"];
    [list addObject:listItem];

  NSString *listItem =@"FooBar";
        [list addObject:listItem];

答案 7 :(得分:0)

看起来你并没有真正初始化NSMutableArray

在对象的init事件中,只需说

 [self setList:[[NSMutableArray alloc] initWithCapacity:10]]];

(我只想说init,但我不记得是否有效。你开始时的容量并不重要)

在实际分配数组之前,变量“list”的值为nil。