我有下面的函数返回分配的内存
- (NSString *) getBlock
{
NSString *block = [[NSString alloc] int];
....... doing something over here
return block;
}
// I have the class interface like this
@interface myDataDetail : NSObject {
NSString *myName;
NSString *myMarks;
}
dealloc {
myName release;
myMarks release;
[super dealloc];
}
我正在做以下事情
myDataDetail *detail = [[myDataDetail alloc] init];
detail.myName = [self getBlock]; //here leak
detail.myMarks = [self getBlock]; //here leaak
....在这里做一些事情
[detail release];
当我使用Instruments Memory泄漏运行应用程序时,我会在线报告泄漏。我在这做错了什么?有人可以告诉我实现这种结构的正确方法。
答案 0 :(得分:1)
首先,getBlock应自动释放:
- (NSString *) getBlock
{
NSString *block = [[[NSString alloc] int]autorelease];
....... doing soemthing over here
return block;
}
因为它是吸气剂,所以不应该保留。虽然它不应该释放,因为这将确保返回的引用无效。
应将两个字段附带的属性定义为复制或保留。在您的情况下,因为它们是NSStrings,所以最好将它们设置为复制:
@property(nonatomic,copy) NSString *myName;
@property(nonatomic,copy) NSString *myMarks;
答案 1 :(得分:0)
在你的getBlock函数中,你应该在返回之前自动释放对象:
- (NSString *) getBlock
{
NSString *block = [[NSString alloc] int];
....... doing soemthing over here
[block autorelease];
return block;
}
这放弃了此功能的“所有权”,但不会立即销毁它,以便访问它的功能可以声称“所有权”
内存管理的一个基本规则是,无论何时调用“alloc”,都应该在指向对象的指针被销毁之前的某个点上具有相同的函数/对象调用“release”或“autorelease”。因此,由于这是在单个函数中,并且您没有将指针存储在类中,因此需要将其释放到那里。
答案 2 :(得分:0)
- (NSString *) getBlock
{
NSString *block =[ [[NSString alloc] int]autorelease];
return block;
}