NSMutableArray中的内存泄漏

时间:2010-12-22 13:44:40

标签: iphone objective-c memory-leaks

while(sqlite3_step(selectstmt) == SQLITE_ROW) {
            NSInteger primaryKey = sqlite3_column_int(selectstmt, 0);
//Expenseentry* temp=[[[Expenseentry alloc]init]autorelease];
//Expenseentry* temp=[[Expenseentry alloc]init];
            temp=nil;
            temp=[[Expenseentry alloc]init];
                        //memory leak here
            temp.ID=[NSString stringWithFormat:@"%d",primaryKey];
                        //memory leak here 
            int i=1;    
 @try{
//Expenseentry* temp=[[Expenseentry alloc]init];
//tried this but no luck
 NSString   *s=[[NSString alloc]initWithFormat:@"%f",sqlite3_column_double(selectstmt, 1)];
                        temp.amount=s;
                        [s release];
                        [arrreturn addObject:temp];
                        //[temp release];
//if i uncomment this app crashes 
                        //[formatter release];
                        //printf("\n daata count %d ",[arrreturn count]);
                    }
                    @catch(id ex )
                    {
                        printf("ooooopssss exception ");
                    }
                    i++;
            }


我的费用入门课程


@interface Expenseentry : NSObject {
    NSString *ID; 
    NSString *amount;

}
@property (nonatomic, retain) NSString *ID;
@property (nonatomic, retain) NSString *amount;
@end
 and .m is just 
- (void)dealloc {
    [ID release];
[amount release]
}

3 个答案:

答案 0 :(得分:2)

  1. 看起来temp是该类的实例变量
  2. 确保在完成后或在您再次使用之前释放温度
  3. 尝试执行以下操作

    [temp release];
    temp=[[Expenseentry alloc]init];
    temp.ID=[NSString stringWithFormat:@"%d",primaryKey];
    

    另一种选择是在while(sqlite3_step)循环内完成后释放

    while(sqlite3_step(selectstmt) == SQLITE_ROW) {
    ...
    temp=[[Expenseentry alloc]init];
    temp.ID=[NSString stringWithFormat:@"%d",primaryKey];
    ... //Use temp
    [temp release];
    temp = nil; //Best practice to set it to nil
    

    如果temp.ID字符串泄漏,您需要查看Expenseentry类以确保在那里进行适当的内存管理。

    编辑:我现在看到你发布的其余代码

    [arrreturn addObject:temp];
    //[temp release];
    //if i uncomment this app crashes
    

    它可能崩溃的原因正如我之前所说的那样确保你在发布后将其设置为nil

    编辑2:您正在重复使用while循环内的同一个对象 您需要将临时分配移动到while循环中,否则该数组中的每个对象都将指向同一个对象。我不确定你的目标是什么,但看看下面的代码。

    while(i>5)
    {
       temp=[[Expenseentry alloc]init];
       temp.ID=[NSString stringWithFormat:@"%d",primaryKey];
       @try
       {
          NSString   *s=[[NSString alloc]initWithFormat:@"%f",sqlite3_column_double(selectstmt, 1)];
                            temp.amount=s;
                            [s release];
                            [arrreturn addObject:temp];
       }
       @catch(id ex )
       {
          printf("ooooopssss exception ");
       }
       [temp release];
       temp = nil;
       i++;
    }
    

答案 1 :(得分:1)

temp = nil似乎有点奇怪。无论何时将变量temp分配给新对象,都不要忘记释放上一个对象。

如果你写:

Expenseentry* temp=[[Expenseentry alloc]init];
temp=nil;

你得到了内存泄漏,因为你已经创建了一个Expenseentry对象,然后基本上对该对象说了很好的解决方法。你需要做一个[临时释放];在iphone上分配nil之前。

可能存在其他泄漏,例如您的Expenseentry,但您没有显示它的外观,即如何声明属性ID。

答案 2 :(得分:0)

好的,如果任何人都可以解释这种行为,我发现我的错误只是发布:
内存泄漏导致数组和数组对象没有被释放。如果我发布任何应用程序崩溃。

错误1:[super dealloc]在费用考试的dealloc中丢失 怀疑:当苹果医生说你必须释放你拥有的对象时,为什么需要释放超级?

错误2:此函数返回的数组存储在调用者的实例变量(以及带属性的retain属性的合成属性)中。
并且我在dealloc中释放了该属性,因为它被保留。

receivedArr=fun()

in dealloc

[receivedArr release]