MKAnnotationView:内存泄漏

发布于 2024-11-30 05:27:56 字数 562 浏览 2 评论 0原文

我正在使用以下代码来制作注释的引脚:

- (MKAnnotationView *) mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)           annotation
{
    MKPinAnnotationView *annView=[[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"currentloc"];
    annView.pinColor = MKPinAnnotationColorGreen;
    annView.animatesDrop=TRUE;
    annView.canShowCallout = YES;
    annView.calloutOffset = CGPointMake(-5, 5);

    return annView;
}

一切正常,但是 XCode 中的分析显示此代码中存在内存泄漏。事实上,我也看到了这一点,因为我分配了对象,然后没有释放它。 这里如何避免内存泄漏?

I'm using the following code to make a pin for annotation:

- (MKAnnotationView *) mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)           annotation
{
    MKPinAnnotationView *annView=[[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"currentloc"];
    annView.pinColor = MKPinAnnotationColorGreen;
    annView.animatesDrop=TRUE;
    annView.canShowCallout = YES;
    annView.calloutOffset = CGPointMake(-5, 5);

    return annView;
}

Everything works perfectly, however Analyze in XCode shows memory leak in this code. In fact, I see it too cos I allocated object and then did not released it.
How can I avoid memory leak here?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

罗罗贝儿 2024-12-07 05:27:56

你没有写,但我认为分析器告诉你它在这里泄漏了什么:

MKPinAnnotationView *annView=[[MKPinAnnotationView alloc] 
                                 initWithAnnotation:annotation 
                                    reuseIdentifier:@"currentloc"];

那是因为你需要自动释放项:

MKPinAnnotationView *annView=[[[MKPinAnnotationView alloc] 
                                  initWithAnnotation:annotation 
                                     reuseIdentifier:@"currentloc"] autorelease];

更新

另外你不重用创建的注释,尝试这样做:

MKPinAnnotationView *annView = (MKPinAnnotationView*)[mapView dequeueReusableAnnotationViewWithIdentifier:@"currentloc"];
if(annView == nil) 
    annView = annView=[[[MKPinAnnotationView alloc] 
                         initWithAnnotation:annotation 
                            reuseIdentifier:@"currentloc"] autorelease];

You didn't wrote, but I think analyzer tells you what it leaks here:

MKPinAnnotationView *annView=[[MKPinAnnotationView alloc] 
                                 initWithAnnotation:annotation 
                                    reuseIdentifier:@"currentloc"];

Thats because you need autorelease item:

MKPinAnnotationView *annView=[[[MKPinAnnotationView alloc] 
                                  initWithAnnotation:annotation 
                                     reuseIdentifier:@"currentloc"] autorelease];

UPDATE

Also you don't reuse created annotations, try do this:

MKPinAnnotationView *annView = (MKPinAnnotationView*)[mapView dequeueReusableAnnotationViewWithIdentifier:@"currentloc"];
if(annView == nil) 
    annView = annView=[[[MKPinAnnotationView alloc] 
                         initWithAnnotation:annotation 
                            reuseIdentifier:@"currentloc"] autorelease];
牵你的手,一向走下去 2024-12-07 05:27:56

事实上,我也看到了它,因为我分配了对象,然后没有释放它。

您关于泄漏原因的说法是正确的。如果您需要从方法返回分配的对象,那么想法是自动释放它。

- (MyClass *)getObject {
    MyClass *obj = [[MyClass alloc] init];
    return [obj autorelease];
}

然后,如果需要,您将在调用者中保留返回的对象。

或者以明确返回的对象需要在调用者中释放的方式命名该方法。然后在调用者中释放。

In fact, I see it too cos I allocated object and then did not released it.

You are right about the reason of the leak. If you need to return an alloced object from a method then the idea is to autorelease that.

- (MyClass *)getObject {
    MyClass *obj = [[MyClass alloc] init];
    return [obj autorelease];
}

Then you will retain the returned object in caller if needed.

Or name the method in such a way that it is clear that the returned object need to be released in caller. And then release in the caller.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文