【问题标题】:Convert NSString into NSMutableArray将 NSString 转换为 NSMutableArray
【发布时间】:2011-03-23 12:36:39
【问题描述】:

我正在尝试将 NSString 转换(或复制?)为 NSMutableArray。我想我的问题是我不太了解 MutableArray 的结构。在我有限的知识中,一个数组可能看起来像这样:

NoteBook = [[NSMutableArray alloc] init];

for (int temp = 0; temp < 3; temp++) {
    [NoteBook insertObject:@"Page" atIndex:temp];
}

这会给我一个 PagePagePage 数组。假设我想打开一个包含 PagePagePage 的 txt 文件,但是这些单词由一个定义的字符串分隔,以便我可以将数组中的各个对象分开,如下所示: Page--- end of page -- -页---页尾---页

现在,我的下一步是从 txt 文件中读取此信息:

NSString *tempTextOut = [NSString stringWithContentsOfFile:filePath
                                                 encoding:NSUTF8StringEncoding
                                                    error:&error];
NoteBook = [tempTextOut componentsSeparatedByString: @"\n--- end of page ---\n"];

但是,最后一行不起作用,xCode 告诉我:分配“struct NSArray*”的不兼容 Objective-C 类型,预期为“struct NSMutableArray*”。我不太明白这一点 - NSArray 和 MutableArray 应该是兼容的(因为一个是另一个的子类)。 xCode 不应该告诉我问题在于我一直在尝试将 NSString 转换为 NSMutableArray 吗?

我可能需要重新设置我的 MutableArray,然后再放回它,因为现在,它仍然包含我在第一步中分配给它的 PagePagePage。我以为我的 NoteBook 可变数组会简单地被字符串替换,但我想不会是这样。

我非常感谢您在这件事上的任何帮助。谢谢!

【问题讨论】:

标签: iphone objective-c cocoa-touch nsstring nsmutablearray


【解决方案1】:

componentsSeparatedByString: 返回一个普通的不可变 NSArray,而不是 NSMutableArray。您可以将数组传递给 [NSMutableArray arrayWithArray:] 或在数组上使用 mutableCopy 以从中获取可变数组,或者您可以在现有 NSMutableArray 上使用 addObjectsFromArray: 向其中添加对象。

如果您走mutableCopy 路线,请记住您有责任致电releaseautorelease

【讨论】:

    【解决方案2】:

    如果要操作不可变实例,将可变对象分配给相同的不可变类型会导致运行时错误。

    您可以通过调用获取可变副本:

    NoteBook = [[tempTextOut componentsSeparatedByString: @"\n--- end of page ---\n"] mutableCopy];
    

    如果 NoteBook 是一个保留属性,您应该这样分配给它:

    self.NoteBook = [[[tempTextOut componentsSeparatedByString: @"\n--- end of page ---\n"] mutableCopy] autorelease];
    

    所以可变副本不会被过度保留。您可以像往常一样在您的 dealloc 方法中释放。

    【讨论】:

    • 请注意,您最终将负责释放NoteBook,因为它不会像原始数组那样自动释放。
    • 是的,您通过调用 mutableCopy 声明所有权。
    • @Noah Witherspoon:谢谢!我已经在程序最后的 dealloc 方法中发布了它,但它之前就在那里,因为我在一开始就为 NoteBook 做了 alloc init 的事情。因此,您是说我也需要在其他地方发布它吗?还是在我的dealloc中释放它就足够了?我猜你的意思不是 tempTextOut,因为它会自动释放,对吧?
    • 谢谢,这解释得很漂亮!我想这是我第一次明白什么是超越保留的意思。非常感谢这个启发性的时刻!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-30
    • 1970-01-01
    相关资源
    最近更新 更多