Mat*_*ieu 1 arrays pointers memory-leaks objective-c
- (无效)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];
}
}
Run Code Online (Sandbox Code Playgroud)
searchFilters是可以设置为true或false的过滤器列表,我使用userFilters使用仅设置为TRUE的过滤器填充表视图
但是行SearchCriteria*tmpSc = [[SearchCriteria alloc] init]; 导致泄漏,我不知道如何解决,因为如果我在函数结束时释放我松开指针,它崩溃
有任何想法吗?
如果searchFilters可以很大,twolfe18使代码>慢得多.(虽然FE比objectAtIndex:更快,但这夸大了问题所以我已经打了它;看看我对Fast Enumeration的优点的其他评论.)-objectAtIndex:对大型阵列来说不是一个快速操作,所以你不应该做更多的事情.
您的代码中存在许多问题:
永远不要创建一个开始"设置"但不是访问者的方法.由于Objective-C如何提供密钥值合规性,这可能会导致非常令人惊讶的错误.名字很重要.名为的属性userFilters应该调用一个getter -userFilters并调用一个setter -setUserFilters:.setter应采用与getter返回的相同类型.因此,最好调用此方法-updateUserFilters以避免此问题(并更准确地指出它的作用).
始终使用访问者.它们将为您节省各种内存管理问题.如果-setUserFilters调用两次,您当前的代码将泄漏整个数组.
这两条评论都是正确的,你不需要在这里分配一个临时的.事实上,您最好的解决方案是使用快速枚举,它既快速又非常高效(并且最容易编码).
把它们全部拉到一起,这就是你想要做的事情(至少有一种方法可以做到这一点,还有许多其他好的解决方案,但这个很容易理解):
@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];
}
}
}
Run Code Online (Sandbox Code Playgroud)