我有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
的操作放在包含成员变量的类的成员函数内。
答案 0 :(得分:4)
是不好的做法。 但是在你的代码中你创建了一个没有人是所有者的数组,正确地压缩你的数组。
不要忘记初始化你的数组
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。