NSString componentsSeparatedByString: 返回自动释放的数组吗?

Posted

技术标签:

【中文标题】NSString componentsSeparatedByString: 返回自动释放的数组吗?【英文标题】:Does NSString componentsSeparatedByString: return autoreleased array? 【发布时间】:2010-11-25 06:00:05 【问题描述】:

在下面的方法中,我不确定为什么释放其中一个数组会导致异常。我能看到的唯一原因是 componentsSeparatedByString 返回一个自动释放的数组,但我看不到文档提到它这样做。

-(void)addRow:(NSString *)stringWithNumbers;


    NSArray *numbers = [stringWithNumbers componentsSeparatedByString:@" "];
    NSMutableArray *row = [[NSMutableArray alloc] initWithCapacity:[numbers count]];
    for (NSString *number in numbers) 
        Number *n = [[Number alloc] initWithNumber:number];
        [row addObject:n];
        [n release];
    
    [rows addObject:row];
    [row release];
//    [numbers release];  <-- leads to exception

任何人都可以确认该阵列是否是自动释放的吗?如果是这样,我怎么知道/为什么我应该知道? 是否可以通过代码检查对象的任何一个实例是否自动释放?

【问题讨论】:

【参考方案1】:

是的,因为方法的名称:

不以new 开头 不以alloc 开头 不是retain 不包含copy

这通常被称为“NARC”规则,并在此处进行了全面解释:http://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmObjectOwnership.html#//apple_ref/doc/uid/20000043-SW1

【讨论】:

【参考方案2】:

除非你专门分配内存,系统方法会给你一个自动释放的方法。

【讨论】:

-1 错误。 “malloc”专门分配内存。 copy 不保证返回一个新对象。 retain 不分配新内存。然而在所有这些情况下,你拥有记忆并且必须放弃它。【参考方案3】:

按照惯例,所有名称中带有 init 或 copy 的方法都返回非自动释放的对象。

【讨论】:

-1 错误。返回拥有对象的是 alloc 方法,而不是 init 方法。

以上是关于NSString componentsSeparatedByString: 返回自动释放的数组吗?的主要内容,如果未能解决你的问题,请参考以下文章

NSString

NSString基本概念

将 NSString 转换为具有日期格式的 NSString 块

NSString 到 CFStringRef 和 CFStringRef 到 ARC 中的 NSString?

NSString 转换 UTF8

iOS-将NSString转换成UTF8编码的NSString