Objective c 指针数组导致泄漏

Objective c 指针数组导致泄漏,objective-c,arrays,pointers,memory-leaks,Objective C,Arrays,Pointers,Memory Leaks,-(void)setUserFilters{ //init the user filters array userFilters = [[NSMutableArray alloc] init]; SearchCriteria *tmpSc= [[SearchCriteria alloc] init]; for(int i=0;i<[searchFilters count];i++) { tmpSc=[self.searchFilters ob

-(void)setUserFilters{

    //init the user filters array
    userFilters = [[NSMutableArray alloc] init];
    SearchCriteria *tmpSc= [[SearchCriteria alloc] init];
    for(int i=0;i<[searchFilters count];i++)
    {
    tmpSc=[self.searchFilters objectAtIndex:i];
    if(tmpSc.enabled==TRUE)
        [userFilters addObject:tmpSc];
    }
    }
//初始化用户筛选器数组
userFilters=[[NSMutableArray alloc]init];
SearchCriteria*tmpSc=[[SearchCriteria alloc]init];

对于(inti=0;i首先,您可以编写的最糟糕的n00b代码包括
如果(条件==true)做某事()
,只需编写
如果(条件)做某事()

其次,根本没有理由使用tempSc(更不用说它的alloc内存),您可以执行以下操作:

-(void)setUserFilters{

//init the user filters array
userFilters = [[NSMutableArray alloc] init];
for(int i=0;i<[searchFilters count];i++)
{
    if([self.searchFilters objectAtIndex:i].enabled)
            [userFilters addObject:[self.searchFilters objectAtIndex:i]];
}
}
-(void)setUserFilters{
//初始化用户过滤器数组
userFilters=[[NSMutableArray alloc]init];

对于(inti=0;i首先,您可以编写的最糟糕的n00b代码包括
如果(条件==true)做某事()
,只需编写
如果(条件)做某事()

其次,根本没有理由使用tempSc(更不用说它的alloc内存),您可以执行以下操作:

-(void)setUserFilters{

//init the user filters array
userFilters = [[NSMutableArray alloc] init];
for(int i=0;i<[searchFilters count];i++)
{
    if([self.searchFilters objectAtIndex:i].enabled)
            [userFilters addObject:[self.searchFilters objectAtIndex:i]];
}
}
-(void)setUserFilters{
//初始化用户过滤器数组
userFilters=[[NSMutableArray alloc]init];

对于(int i=0;i,您最初创建的SearchCriteria对象,在使用或释放它之前,您将变量从self.searchFilters重新分配给另一个对象。因此,您不需要创建初始对象,也不需要解释为什么它会泄漏或不被释放

尝试:


希望这会有所帮助。

看起来您最初创建的SearchCriteria对象,在使用或释放它之前,您将变量从self.searchFilters重新分配给另一个对象。因此,您不需要创建初始对象,也不需要解释为什么它会泄漏或不释放

尝试:

希望这会有所帮助。

如果searchFilters可能很大,twolfe18会使代码>的速度慢得多。
-objectAtIndex:
在大型阵列上不是一个快速操作,因此您不应该做得太多。(虽然FE确实比objectAtIndex:快,但这夸大了这个问题,因此我删除了它;请参阅我关于快速枚举优势的其他评论。)

您的代码中存在许多问题:

  • 永远不要创建以“set”开头的方法但是不是访问器。这可能会导致非常令人惊讶的错误,因为Objective-C如何提供键值遵从性。名称很重要。名为
    userFilters
    的属性应该有一个名为
    -userFilters
    的getter和一个名为
    -setUserFilters:
    的setter。setter应该采用getter返回的相同类型。因此最好将is方法称为
    -updateUserFilters
    ,以避免此问题(并更正确地指示其作用)

  • 始终使用访问器。它们将为您节省各种内存管理问题。如果调用
    -setUserFilters
    两次,您当前的代码将泄漏整个阵列

  • 这两条注释都是正确的,您不需要在此处分配临时值。事实上,您最好的解决方案是使用快速枚举,它既非常快速,又非常节省内存(而且最容易编码)

综上所述,以下是您想要做的事情(至少有一种方法可以做到,还有许多其他好的解决方案,但这一个很容易理解):

如果searchFilters可能很大,twolfe18会使代码>的速度慢得多。
-objectAtIndex:
在大型阵列上不是一个快速操作,因此您不应该做得太多。(虽然FE确实比objectAtIndex:快,但这夸大了这个问题,因此我删除了它;请参阅我关于快速枚举优势的其他评论。)

您的代码中存在许多问题:

  • 永远不要创建以“set”开头的方法但是不是访问器。这可能会导致非常令人惊讶的错误,因为Objective-C如何提供键值遵从性。名称很重要。名为
    userFilters
    的属性应该有一个名为
    -userFilters
    的getter和一个名为
    -setUserFilters:
    的setter。setter应该采用getter返回的相同类型。因此最好将is方法称为
    -updateUserFilters
    ,以避免此问题(并更正确地指示其作用)

  • 始终使用访问器。它们将为您节省各种内存管理问题。如果调用
    -setUserFilters
    两次,您当前的代码将泄漏整个阵列

  • 这两条注释都是正确的,您不需要在此处分配临时值。事实上,您最好的解决方案是使用快速枚举,它既非常快速,又非常节省内存(而且最容易编码)

综上所述,以下是您想要做的事情(至少有一种方法可以做到,还有许多其他好的解决方案,但这一个很容易理解):


此外,在Objective-C中,关键字是
YES&NO
,而不是
true&false
。有时true会起作用,但不要依赖它。正确,Objective-C确实使用YES和NO,但我相信true、false、true和false都是定义为YES和NO的。我从未见过true或false不起作用的情况。你说得很好但是应该使用YES和NO。YES被定义为对有符号字符的1转换。true在C中被替换为符号“1”(因此其类型和大小未定义)在C++中,true是布尔类型。是的,它们通常在条件句中是类似的;它们可能不是相同的大小,也可能不编码相同的。不要混合它们。Objul-C真值是YES,类型是Boo.ObjytoC中,关键字是“代码>是的,不是/<代码>,而不是<代码> true和false < /Calp>。有时,真的会起作用,BU。不要依赖它。正确,Objective-C确实使用YES和NO,但我相信TRUE、FALSE、TRUE和FALSE都被定义为是和否。我没有见过TRUE或FALSE不起作用的情况。好的风格要求你应该使用YES和NO。YES被定义为对有符号字符的1转换。TRUE在C中被替换为符号“1”(所以它的类型和大小是未定义的)。在C++中,真是布尔类型。是的,它们将
@interface MyObject ()
@property (nonatomic, readwrite, retain) NSMutableArray *userFilters;
@property (nonatomic, readwrite, retain) NSMutableArray *searchFilters;
@end

@implementation MyObject
@synthesize userFilters;
@synthesize searchFilters;

- (void)dealloc
{
    [searchFilters release];
    serachFilters = nil;
    [userFilters release];
    userFilters = nil;
    [super dealloc];
}


- (void)updateUserFilters
{
    //init the user filters array
    // The accessor will retain for us and will release the old value if
    // we're called a second time
    self.userFilters = [NSMutableArray array];

    // This is Fast Enumeration
    for (SearchCriteria *sc in self.searchFilters)
    {
        if(sc.enabled)
        {
            [self.userFilters addObject:sc];
        }
    }
}