0

问题 1

Place *place = [[[Place alloc] initwithCoordinate:location anotationType:CSMapAnnotationTypeStart] autorealease];
place.name = name;
place.description = description;
place.strUniqueIdentity = uniqueIdentity;
NSLog(@"Unique identity %@",uniqueIdentity);

PlaceMark *marker = [[PlaceMark alloc] initWithPlace:place annotationType:MapAnnotationTypePin];
return [marker autorelease];

当我分析 xcode 4.6.2 中的代码时,它在倒数第二行显示“对象已发送 -autorelease 太多次”。我不明白为什么它会显示。

截图 1

问题2:

return [[[OAProblem alloc] initWithResponseBody:response] autorelease];

在这一行中,它显示“存储在'self'中的对象的潜在泄漏”。

截图 2

4

6 回答 6

3

的答案Why are you not using Arc?完全无效。OP 特别询问为什么会在他自己的环境中发生这种情况。所以:

你能告诉我们你的:

Place *place = [[Place alloc] initwithCoordinate:location anotationType:CSMapAnnotationTypeStart];

还要使用仪器,看看您的项目是否存在问题。并非静态分析器显示的所有内容实际上都是问题。可能会出现一些误报。

所以从你的回复中你有这个:

 -(id)initwithCoordinate:(CLLocationCoordinate2D)coordinate anotationType:(CSMapAnnotationType)anotationType{ 
self.latitude = coordinate.latitude; 
self.longitude = coordinate.longitude; 
self.mapAnnotationType = anotationType; 
return self;
 }

应该是这样的:

-(id)initwithCoordinate:(CLLocationCoordinate2D)coordinate anotationType:(CSMapAnnotationType)anotationType{
    if (self = [super init])
    {
        self.latitude = coordinate.latitude;
        self.longitude = coordinate.longitude;
        self.mapAnnotationType = anotationType;
    }
        return self;
}

这就是为什么他抱怨保留计数 == 0 的对象。

于 2013-04-23T07:43:09.690 回答
2

您会收到警告,因为 of 的拼写initwithCoordinate错误。根据 Cocoa 命名约定,它应该是initWithCoordinate(大写 W)。

于 2013-04-23T07:55:56.940 回答
1

Xcode 对 OAProblem.c 的分析器警告非常无用。

真正有问题的代码在 init 方法中。警告(在这种情况下)意味着“一个 init 方法返回 nil 而不释放由 alloc 分配的对象”。解决方法是[self release]在两个失败路径中添加一个:

- (id)initWithProblem:(NSString *) aProblem
{
    NSUInteger idx = [[OAProblem validProblems] indexOfObject:aProblem];
    if (idx == NSNotFound) {
        [self release]; // <-- Add this line to fix the warning
        return nil;
    }

    return [self initWithPointer: [[OAProblem validProblems] objectAtIndex:idx]];
}

和同样的initWithResponseBody

于 2013-06-17T11:34:41.827 回答
0
Place *place = [[Place alloc] initwithCoordinate:location anotationType:CSMapAnnotationTypeStart];
place.name = name;
place.description = description;
place.strUniqueIdentity = uniqueIdentity;
NSLog(@"Unique identity %@",uniqueIdentity);

PlaceMark *marker = [[PlaceMark alloc] initWithPlace:place    annotationType:MapAnnotationTypePin];
[place release];//I think you are release place object, cause of memory leak
return [marker autorelease];
于 2013-04-23T07:32:57.303 回答
0

我的问题第一部分的答案是初始化方法中的小“w”

-initwithCoordinate: anotationType:

根据 Cocoa 命名约定,我必须使用大写字母“W”。

我将初始化方法替换为

-initWithCoordinate: anotationType:

我的问题的第二部分的答案是在两个失败路径中添加一个 [self release]

Xcode 对 OAProblem.c 的分析器警告非常无用。

真正有问题的代码在 init 方法中。警告(在这种情况下)意味着“一个 init 方法返回 nil 而不释放由 alloc 分配的对象”。修复方法是在两个失败路径中添加 [self release]:

- (id)initWithProblem:(NSString *) aProblem
{
    NSUInteger idx = [[OAProblem validProblems] indexOfObject:aProblem];
    if (idx == NSNotFound) {
        [self release]; // <-- Add this line to fix the warning
        return nil;
    }

    return [self initWithPointer: [[OAProblem validProblems] objectAtIndex:idx]];
}

和 initWithResponseBody 一样。

于 2013-04-23T08:47:13.020 回答
-2

更好的解决方案是将您的应用程序转换为 ARC(自动引用计数)。它可能会占用内存问题。

把你的xcode项目编辑>重构>转换为目标C ARC>确定

于 2013-04-23T07:30:33.377 回答