指针数组导致泄漏

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]; 导致泄漏,我不知道如何解决,因为如果我在函数结束时释放我松开指针,它崩溃

有任何想法吗?

Rob*_*ier 5

如果searchFilters可以很大,twolfe18使代码>慢得多.-objectAtIndex:对大型阵列来说不是一个快速操作,所以你不应该做更多的事情.(虽然FE比objectAtIndex:更快,但这夸大了问题所以我已经打了它;看看我对Fast Enumeration的优点的其他评论.)

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

  • 永远不要创建一个开始"设置"但不是访问者的方法.由于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)

  • NSArray"是一个数组",因为它提供了一个支持类似数组操作的对象的接口.它不是保证在封面下像C数组一样实现,并且没有关于对象访问速度的保证. (2认同)