开发者

Does NSString componentsSeparatedByString: return autoreleased array?

开发者 https://www.devze.com 2023-01-26 16:38 出处:网络
In the following method, I\'m unsure of why releasing one of the arrays leads to an exception. The only reason that I could see, would be if componentsSeparatedByString returns an autoreleased array,

In the following method, I'm unsure of why releasing one of the arrays leads to an exception. The only reason that I could see, would be if componentsSeparatedByString returns an autoreleased array, but I can't see that the documentation mentions that it do.

-(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
}

Can anyone confirm if the array is autoreleased? If so, how can I know/why should I have known?

Is it possible to check if any one instance of an object is autoreleased or not by code?


Yes, because the name of the method:

  • does not start with new
  • does not start with alloc
  • is not retain
  • does not contain copy

This is commonly known as the "NARC" rule, and is fully explained here: http://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmObjectOwnership.html#//apple_ref/doc/uid/20000043-SW1


unless you specifically allocate memory, a system method will give you back an autoreleased method.


By convention all methods with init or copy in their names return non-autoreleased objects.

0

精彩评论

暂无评论...
验证码 换一张
取 消