【问题标题】:iphone development memory leakiphone开发内存泄漏
【发布时间】:2011-04-06 21:52:45
【问题描述】:

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

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

【问题讨论】:

    标签: iphone objective-c memory-leaks


    【解决方案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;
    

    【讨论】:

      【解决方案2】:

      在您的 getBlock 函数中,您应该在返回之前自动释放对象:

      - (NSString *) getBlock
      {
          NSString *block = [[NSString alloc] int];
          ....... doing soemthing over here
          [block autorelease];
          return block;
      }
      

      这放弃了此函数的“所有权”,但不会立即销毁它,以便访问它的函数可以声明“所有权”

      内存管理的一个基本规则是,每当你调用“alloc”时,在指向对象的指针被销毁之前,你应该在某个时刻调用相同的函数/对象调用“release”或“autorelease”。因此,由于这是在单个函数中,并且您没有将指针存储在类中,因此您需要在此处释放它。

      【讨论】:

        【解决方案3】:
        - (NSString *) getBlock
        {
            NSString *block =[ [[NSString alloc] int]autorelease];
        
            return block;
        }
        

        【讨论】: