2011-03-03 22 views
3

考虑下面的代码正确的方式把NSString的内部NSMutableArray的方法

- (void) method1 
{ 

list = [[NSMutableArray alloc] init]; 

NSString *f =[[NSString alloc] initWithCString: "f"]; 

[list addObject: f]; 
} 

- (void) method2... 

列表是一个类的实例变量中,我需要访问所有的变量列表内的其他方法,例如方法2,当我分配一个NSString在方法1,我应该需要保留它吗?我发现不需要保留?为什么?

+1

'-initWithCString:'已弃用,因为结果可能因用户的默认字符编码而异。要么只是使用直接文字'NSString * f = @“f”;'或使用'-initWithCString:encoding:'或使用'-initWithUTF8String:' – JeremyP 2011-03-03 16:31:55

回答

4

当你alloc的东西,你已经是业主,所以没有必要retain它。

查看here的全文。

你的方法(和类)实际上在内存管理方面写得很差。你应该:

  1. 释放list分配和它分配一个新的列表之前

  2. dealloc方法释放list

  3. 释放字符串中,你将它添加到阵列

因此,将您的方法更改为:

- (void) method1 { 
    [list release]; 
    list = [[NSMutableArray alloc] init]; 
    NSString *f = [[NSString alloc] initWithCString: "f"]; 
    [list addObject: f]; 
    [f release]; 
} 

- (void) dealloc { 
    [list release]; 
    // release other instance variables... 
    [super dealloc]; 
} 
+0

为什么我需要在method1的末尾释放f? – Howard 2011-03-03 17:24:11

+0

因为你需要平衡保留隐含的分配... – bbum 2011-03-03 17:50:44

+0

确切的说,因为你_own_f(你'分配它),它是''释放'它的责任。 – 2011-03-03 18:05:32

0

您将需要一个@该字符串@“F”

,这涵盖了内存管理问题 NSMutableArray memory management

+0

你不需要'@',因为他使用C字符串初始化,而不是NSString。 – yan 2011-03-03 16:02:17

+0

他使用'initWithCString:',所以@是不合适的。请记住,尽管这是一个*弃用的方法*,所以@Howard,不要使用它! – Richard 2011-03-03 16:02:35

+0

对不起。你们是对的。没有@需要。 – madmik3 2011-03-03 16:04:56

0

你不需要把它保留下来,因为你是主人当你alloc一个类并接收一个实例。添加到NSMutableArray后,您实际上需要释放它。当向NSMutableArray添加对象时,它会向它们发送retain消息并取得所有权。

此外,请注意initWithCString已被弃用。如果你需要从C柱到初始化使用下列方式代替:

[NSString stringWithCString:"f" encoding:NSUTF8StringEncoding]; 

但如果你只是建立一个恒定的NSString,只使用文字。它会自动自动释放,让您的意图更清晰。即:

list = [[NSMutableArray alloc] init] 
[list addObject:@"f"]; 
+0

>>向NSMutableArray添加对象时,会向其发送保留消息并获取所有权。 - 关于这个的任何文件? – Howard 2011-03-03 17:24:42

+0

@霍华德:你其实不需要这些信息。重要的是要知道,因为你_own_f,你必须释放它。您不需要知道_other_代码如何正确写入_your_代码。 – 2011-03-03 18:07:02