我正在尝试将NSString转换(或复制?)为NSMutableArray。我想我的问题是我并不真正了解MutableArray的结构。在我有限的知识中,数组看起来像这样:
NoteBook = [[NSMutableArray alloc] init];
for (int temp = 0; temp < 3; temp++) {
[NoteBook insertObject:@"Page" atIndex:temp];
}
哪个会给我一个 PagePagePage 数组。我们假设我想打开一个包含PagePagePage的txt文件,但是这些单词被一个已定义的字符串分开,这样我就可以将我的数组中的各个对象分开,如下所示:页面---页面末尾 - -Page ---页面末尾---页面。
现在,我的下一步是从txt文件中读取此信息:
NSString *tempTextOut = [NSString stringWithContentsOfFile:filePath
encoding:NSUTF8StringEncoding
error:&error];
NoteBook = [tempTextOut componentsSeparatedByString: @"\n--- end of page ---\n"];
然而,最后一行不起作用,我告诉xCode:不兼容的Objective-C类型分配'struct NSArray *',期望'struct NSMutableArray *'。我真的不明白这一点 - NSArray和MutableArray应该是兼容的(因为一个是另一个的子类)。不应该xCode告诉我问题是我一直在尝试将NSString转换为NSMutableArray吗?
我可能需要重新设置我的MutableArray,然后再将其放回去,因为现在它仍然包含我在第一步中分配给它的 PagePagePage 。我以为我的NoteBook可变数组只会被字符串替换,但我想情况并非如此。
我非常感谢这件事的任何帮助。谢谢!
答案 0 :(得分:5)
componentsSeparatedByString:
返回一个普通的不可变NSArray,而不是NSMutableArray。您可以将数组传递给[NSMutableArray arrayWithArray:]
或使用数组上的mutableCopy
从中获取可变数组,或者可以在现有NSMutableArray上使用addObjectsFromArray:
向其添加对象。
如果您使用mutableCopy
路线,请务必记住您有责任在其上拨打release
或autorelease
。
答案 1 :(得分:4)
如果要操作不可变实例,将可变对象分配给同一个不可变类型将导致运行时错误。
您可以致电:
获取可变副本NoteBook = [[tempTextOut componentsSeparatedByString: @"\n--- end of page ---\n"] mutableCopy];
如果NoteBook是保留属性,您应该这样指定:
self.NoteBook = [[[tempTextOut componentsSeparatedByString: @"\n--- end of page ---\n"] mutableCopy] autorelease];
所以可变副本不会被保留。您可以正常使用dealloc方法释放。