iphone开发内存泄漏

时间:2011-04-06 21:52:45

标签: iphone objective-c memory-leaks

我有下面的函数返回分配的内存

- (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泄漏运行应用程序时,我会在线报告泄漏。我在这做错了什么?有人可以告诉我实现这种结构的正确方法。

3 个答案:

答案 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;
}