Objective c 指针数组导致泄漏
-(void)setUserFilters{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
//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];
}
}
}