将NSString放在NSMutableArray中的正确方法

时间:2011-03-03 15:58:25

标签: objective-c

考虑以下代码

- (void) method1
{

list = [[NSMutableArray alloc] init];

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

 [list addObject: f];
}

- (void) method2...

list是类的实例变量,当我在 method1 中分配NSString时,我需要以另一种方法访问列表中的所有变量,例如 method2 ,我应该保留吗?我发现不需要保留?为什么呢?

3 个答案:

答案 0 :(得分:4)

当您alloc某事时,您已经是所有者,因此无需retain

查看here的完整故事。

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

  1. 在分配并为其分配新列表之前释放list

  2. list方法

  3. 中发布dealloc
  4. 将字符串添加到数组

  5. 后释放该字符串

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

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

答案 1 :(得分:0)

你需要一个@ @字符串@“f”

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

答案 2 :(得分:0)

您不需要保留它,因为当您alloc一个类并接收实例时,您就是所有者。实际上,您需要在添加到NSMutableArray后释放它。将对象添加到NSMutableArray时,会向其发送retain消息并获得所有权。

另请注意,不推荐使用initWithCString。如果需要从C字符串初始化,请使用以下模式:

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

但如果您只是创建一个常量NSString,只需使用文字。它会自动自动释放,让您的意图更加清晰。即:

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