Objective-C中的内存管理问题

时间:2010-11-15 10:57:13

标签: iphone objective-c

我有一个方法:

-(NSArray   *)doSomething{

    NSArray *array = [[NSArray alloc] initWithObjects:@"Huy 1",@"Huy 2",@"Huy 3",nil];

    [array  release];

    return  array;

}

- (void)viewDidLoad {

    [super viewDidLoad];

    NSArray *array  =   [self   doSomething];

    if(array&&array.count>0){

        NSLog([NSString stringWithFormat:@"%@\n",[array objectAtIndex:1]]);

    }
    else{

        NSLog(@"Null");

    }

}

我认为我在doSomething()上发布了数组,所以它不会返回我在doSomething()上创建的NSArray。我不知道它还打印“Huy 2”?有谁能告诉我为什么?

2 个答案:

答案 0 :(得分:2)

-(NSArray *)doSomething
{
    NSArray *array = [[NSArray alloc] initWithObjects:@"Huy 1",@"Huy 2",@"Huy 3",nil];

    return  [array autorelease];
}

Memory Management Programming Guide

- (void)viewDidLoad 
{
    [super viewDidLoad];
    NSArray *array  =   [self doSomething];

    if([array count]) //if array is nil this will evaluate to false. If count is 0 this will evaluate to false too.
    {
        NSLog(@"%@\n", [array objectAtIndex:1]); //NSLog insert values for you
    }
    else
    {
        NSLog(@"Null");
    }
}

如果这适用于release而不是autorelease,那可能是因为阵列正在使用的内存尚未被其他任何内容使用。这只是机会。我怀疑如果你在NSArray *array = [self doSomething];之后分配一个对象,你会得到意想不到的结果。

答案 1 :(得分:1)

按以下方式使用该方法:

-(NSArray   *)doSomething{

    NSArray *array = [[NSArray alloc] initWithObjects:@"Huy 1",@"Huy 2",@"Huy 3",nil];

    return  [array autorelease];

}