首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >找出漏洞

找出漏洞
EN

Stack Overflow用户
提问于 2009-08-18 18:59:18
回答 4查看 1.7K关注 0票数 1

我仍然在处理我的泄漏问题,我不知道如何解决这个问题--我在每个arrayTmp addObject行上都有泄漏

代码语言:javascript
复制
NSMutableArray *arrayTmp= [[NSMutableArray alloc] init];


[arrayTmp addObject:[NSDictionary dictionaryWithObjectsAndKeys:@"1", @"value", @"Value 1", @"name", nil]];
[arrayTmp addObject:[NSDictionary dictionaryWithObjectsAndKeys:@"2", @"value", @"Value 2", @"name", nil]];
[arrayTmp addObject:[NSDictionary dictionaryWithObjectsAndKeys:@"3", @"value", @"Value 3", @"name", nil]];
[arrayTmp addObject:[NSDictionary dictionaryWithObjectsAndKeys:@"4", @"value", @"Value 4", @"name", nil]];
//add arrayTmp to an object to use later
[arrayTmp release];
arrayTmp=nil;

arrayTmp= [[NSMutableArray alloc] init];

[arrayTmp addObject:[NSDictionary dictionaryWithObjectsAndKeys:@"1", @"value", @"other value 1", @"name", nil]];
[arrayTmp addObject:[NSDictionary dictionaryWithObjectsAndKeys:@"2", @"value", @"other value 2", @"name", nil]];
//add arrayTmp to an object to use later
[arrayTmp release];
arrayTmp=nil;
...

这里是我的过滤器类的代码

代码语言:javascript
复制
@implementation Filter

@synthesize label;
@synthesize valueIndex;
@synthesize listValue;
@synthesize webServiceFieldName;

-(id) initWithLabel:(NSString *)plabel AndValue:(int)pvalueIndex AndListValue:(NSMutableArray *)plistValue AndWebServiceFieldName:(NSString *)pwebServiceFieldName {

self = [super init];

if (self != nil) {
    self.label = plabel;
    self.valueIndex = pvalueIndex;
    self.listValue = plistValue;
    self.webServiceFieldName = pwebServiceFieldName;

}
return self;
}

@end
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2009-08-19 00:03:26

好的,我做了这些更改,但是在这些行中仍然有十几个泄漏,下面是我的代码示例

代码语言:javascript
复制
-(id)initSearchFilters{
    self = [super init];


    if ( self ) {

    //init the search filters array
    self.searchFilters = [[NSMutableArray alloc] init];
    SearchCriteria *searchCriteriaTmp;
    Filter *filterTmp1;
    Filter *filterTmp2;
    NSMutableArray *arrayTmp= [[NSMutableArray alloc] init];

    //Price Range
    arrayTmp = [[NSMutableArray alloc] init];

    [arrayTmp addObject:[NSDictionary dictionaryWithObjectsAndKeys:@"any", @"value", @"any", @"name", nil]];
    [arrayTmp addObject:[NSDictionary dictionaryWithObjectsAndKeys:@"100", @"value", @"$100", @"name", nil]];
    [arrayTmp addObject:[NSDictionary dictionaryWithObjectsAndKeys:@"200", @"value", @"$200", @"name", nil]];
    [arrayTmp addObject:[NSDictionary dictionaryWithObjectsAndKeys:@"300", @"value", @"$300", @"name", nil]];
    [arrayTmp addObject:[NSDictionary dictionaryWithObjectsAndKeys:@"400", @"value", @"$400", @"name", nil]];
    [arrayTmp addObject:[NSDictionary dictionaryWithObjectsAndKeys:@"500", @"value", @"$500", @"name", nil]];


    filterTmp1 = [[Filter alloc] initWithLabel:@"Minimum Price" AndValue:0 AndListValue:arrayTmp AndWebServiceFieldName:@"price_min"];
    filterTmp2 = [[Filter alloc] initWithLabel:@"Maximum Price" AndValue:0 AndListValue:arrayTmp AndWebServiceFieldName:@"price_max"];
    searchCriteriaTmp = [[SearchCriteria alloc] initWithFilter1:filterTmp1 AndFilter2:filterTmp2 AndLabelSearchCriteria:@"Price Range" AndEnabled:NO];
    [self.searchFilters addObject:searchCriteriaTmp];
    [arrayTmp release];
    arrayTmp=nil;
    [filterTmp1 release];
    filterTmp1=nil;
    [filterTmp2 release];
    filterTmp2=nil;
    [searchCriteriaTmp release];
    searchCriteriaTmp=nil;

    //Item
    arrayTmp = [[NSMutableArray alloc] init];

    [arrayTmp addObject:[NSDictionary dictionaryWithObjectsAndKeys:@"1", @"value", @"item 1", @"name", nil]];
    [arrayTmp addObject:[NSDictionary dictionaryWithObjectsAndKeys:@"2", @"value", @"item 2", @"name", nil]];
    [arrayTmp addObject:[NSDictionary dictionaryWithObjectsAndKeys:@"3", @"value", @"item 3", @"name", nil]];
    [arrayTmp addObject:[NSDictionary dictionaryWithObjectsAndKeys:@"4", @"value", @"item 4", @"name", nil]];

    filterTmp1 = [[Filter alloc] initWithLabel:@"Item" AndValue:0 AndListValue:arrayTmp AndWebServiceFieldName:@"item"];
    searchCriteriaTmp = [[SearchCriteria alloc] initWithFilter1:filterTmp1 AndFilter2:nil AndLabelSearchCriteria:@"Item" AndEnabled:NO];
    [self.searchFilters addObject:searchCriteriaTmp];
    [arrayTmp release];
    arrayTmp=nil;
    [filterTmp1 release];
    filterTmp1=nil;
    [searchCriteriaTmp release];
    searchCriteriaTmp=nil;
    }
    return self;
}

我的搜索标准类

代码语言:javascript
复制
-(id)initWithFilter1:(Filter *)pFilter1 AndFilter2:(Filter *)pFilter2 AndLabelSearchCriteria:(NSString *)pLabelSearchCriteria AndEnabled:(BOOL)pEnabled{

self = [super init];

if (self != nil) {
    self.filter1 = pFilter1;
    self.filter2 = pFilter2;
    self.labelSearchCriteria = pLabelSearchCriteria;
    self.enabled =pEnabled;
}
return self;
}

- (void)dealloc
{
[filter1 release];
[filter2 release];
[labelSearchCriteria release];
[super dealloc];
}
票数 -1
EN

Stack Overflow用户

发布于 2009-08-18 22:02:34

代码语言:javascript
复制
//add arrayTmp to an object to use later

这意味着您正在将arrayTmp推入一个对象中,并保留它。否则,代码片段是很好的,但我敢打赌泄漏存在于该方法中。

为您的方法(顺便说一句,如果要遵循Obj的命名约定)发布存储arrayTmp的代码和释放它的代码。

在“仪器”中,您应该能够使用Object仪器看到数组实例。单击任何一个都会给出该地址的分配/保留/发布/取消分配事件的列表。您可以通过展开窗口右侧的“更多信息”窗格(通过底部的一个小按钮)查看任何给定事件的堆栈跟踪。

从下面的代码中,您的初始化程序设置了ivars,包括在tmpArray中传递的内容:

代码语言:javascript
复制
    self.label = plabel;
    self.valueIndex = pvalueIndex;
    self.listValue = plistValue;
    self.webServiceFieldName = pwebServiceFieldName;

但是,我没有看到一个-dealloc方法。

假设您的属性是用retaincopy声明的,那么dealloc应该如下所示:

代码语言:javascript
复制
- (void) dealloc
{
    [label release];
    [listValue release];
    [webServiceFileName release];
    [super dealloc];
}
票数 2
EN

Stack Overflow用户

发布于 2009-08-18 23:08:54

当您去分配这个对象时,您必须确保释放您合成的成员变量--它不会自动为您完成。例如:

代码语言:javascript
复制
- (void)dealloc
{
    [label release];
    [listValue release];
    [webServiceFieldName release];

    [super dealloc];
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1295827

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档