考虑以下代码
- (void) method1
{
list = [[NSMutableArray alloc] init];
NSString *f =[[NSString alloc] initWithCString: "f"];
[list addObject: f];
}
- (void) method2...
list是类的实例变量,当我在 method1 中分配NSString时,我需要以另一种方法访问列表中的所有变量,例如 method2 ,我应该保留吗?我发现不需要保留?为什么呢?
答案 0 :(得分:4)
当您alloc
某事时,您已经是所有者,因此无需retain
。
查看here的完整故事。
您的方法(和类)实际上在内存管理方面写得不好。你应该:
在分配并为其分配新列表之前释放list
在list
方法
dealloc
将字符串添加到数组
因此,请将您的方法更改为:
- (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"];