gpt4 book ai didi

iphone - 删除/添加注释到 map View 会导致内存泄漏

转载 作者:行者123 更新时间:2023-12-03 21:18:18 25 4
gpt4 key购买 nike

我一直在尝试消除 map View 中的内存泄漏。我正在使用自定义 map 图钉类。一切正常,但问题是 - 我需要过滤 map View 结果。当我删除所有 map View 注释并添加过滤结果时,性能工具发现泄漏。但在我使用的这个mapPin类中使用了自动释放,所以它们应该被释放,但它们没有。我究竟做错了什么?

MapPin.h

#import <Foundation/Foundation.h>
#import <MapKit/MapKit.h>
#import <MapKit/MKMapView.h>
#import <MapKit/MKAnnotation.h>

@interface MapPin : NSObject<MKAnnotation> {
CLLocationCoordinate2D coordinate;
NSString * picture;
NSInteger tag_number;
}

@property (nonatomic,assign) CLLocationCoordinate2D coordinate;
@property (nonatomic, copy) NSString *title;
@property (nonatomic, copy) NSString *subtitle;


- (id) initWithCoordinate:(CLLocationCoordinate2D) coord;
- (id) initWithCoordinate:(CLLocationCoordinate2D) coord title:(NSString *) title;
- (id) initWithCoordinate:(CLLocationCoordinate2D) coord title:(NSString *) title subtitle:(NSString *) subtitle;
- (id) initWithCoordinate:(CLLocationCoordinate2D) coord title:(NSString *) title subtitle:(NSString *) subtitle image:(NSString *) pic;
- (id) initWithCoordinate:(CLLocationCoordinate2D) coord title:(NSString *) title subtitle:(NSString *) subtitle image:(NSString *) pic num:(NSInteger) number;
- (void) setPic:(NSString *) picture;
- (NSString* ) getPic;

- (void) setNum:(NSInteger) tag_number;
- (NSInteger ) getNum;

@end

MapPin.m

#import "MapPin.h"


@implementation MapPin

@synthesize coordinate = _coordinate;
@synthesize title = _title;
@synthesize subtitle = _subtitle;


- (id) initWithCoordinate:(CLLocationCoordinate2D) coord
{
return [self initWithCoordinate:coord title:@""];
}

- (id) initWithCoordinate:(CLLocationCoordinate2D) coord title:(NSString *) title {
return [self initWithCoordinate:coord title:title subtitle:@""];

}
- (id) initWithCoordinate:(CLLocationCoordinate2D) coord title:(NSString *) title subtitle:(NSString *) subtitle {
return [self initWithCoordinate:coord title:title subtitle:subtitle image:@""];}

- (id) initWithCoordinate:(CLLocationCoordinate2D) coord title:(NSString *) title subtitle:(NSString *) subtitle image:(NSString *) pic{
MapPin * me = [[[MapPin alloc] init] autorelease];
me.coordinate = coord;
me.title = title;
me.subtitle = subtitle;

[me setPic:pic];

return me;
}

- (id) initWithCoordinate:(CLLocationCoordinate2D) coord title:(NSString *) title subtitle:(NSString *) subtitle image:(NSString *) pic num:(NSInteger) number{
MapPin * me = [[[MapPin alloc] init] autorelease];
me.coordinate = coord;
me.title = title;
me.subtitle = subtitle;

[me setPic:pic];
[me setNum:number];
return me;
}

- (void) setPic:(NSString*) pic {
picture = pic;
}

- (NSString * ) getPic{
return picture;
}

- (void) setNum:(NSInteger) number {
tag_number = number;

}

- (NSInteger ) getNum{
return tag_number;
}

@end

最佳答案

我一直在使用由Mayur Birari创建的自定义 map 图钉,我对其进行了一些调整,以支持自定义 map 图钉图像和 ID。

CustomMapPin.h

#import <Foundation/Foundation.h>
#import <MapKit/MapKit.h>

@interface CustomMapPin : NSObject<MKAnnotation> {

CLLocationCoordinate2D coordinate;
NSString* title;
NSString* subtitle;

NSString* pic;
NSInteger tag_number;

}

@property (nonatomic, assign) CLLocationCoordinate2D coordinate;
@property (nonatomic, copy) NSString* title;
@property (nonatomic, copy) NSString* subtitle;
@property (nonatomic, copy) NSString* pic;
@property (nonatomic) NSInteger tag_number;


@end

CustomMapPin.m

#import "CustomMapPin.h"


@implementation CustomMapPin

@synthesize title;
@synthesize subtitle;
@synthesize coordinate;
@synthesize pic;
@synthesize tag_number;


- (void)dealloc
{
self.title = nil;
self.pic = nil;
self.subtitle = nil;
[super dealloc];
}

@end

并在类里面使用它,如下所示:

CLLocationCoordinate2D pinlocation;

在循环中我设置所需的值并创建 map 图钉:

pinlocation.latitude = ...;

pinlocation.longitude = ...;

NSInteger pinID = ....;


CustomMapPin* customMapPin=[[CustomMapPin alloc] init];

customMapPin.coordinate=(CLLocationCoordinate2D
{pinlocation.latitude,pinlocation.longitude};

customMapPin.title=@"title";

customMapPin.subtitle=@"subtitle";

customMapPin.pic = @"customImageName";

customMapPin.tag_number = pinId;


[mapView addAnnotation:customMapPin];

设置自定义图像:

- (MKAnnotationView *) mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>) annotation
{
if ([annotation isKindOfClass: [CustomMapPin class]])
{
CustomMapPin * a = annotation;

[annView setImage:[UIImage imageNamed:a.pic]];
}
}

获取标注上的 pin id:

- (void)mapView:(MKMapView *)mp annotationView:(MKAnnotationView *)view calloutAccessoryControlTapped:(UIControl *)control
{
CustomMapPin * v = (CustomMapPin *) view.annotation;

int tagNumber = v.tag_number;

....
}

最后 - 在我的项目中需要有过滤器按钮 - 所以我需要删除所有引脚,并添加所需的。默认情况下调用mapview来删除所有造成内存泄漏的注释。因此,当我需要从注释中清除 map View 时,我调用此函数:

- (void)removeAnnotations
{
NSMutableArray *toRemove = [NSMutableArray arrayWithCapacity:[mapView.annotations count]];

for (id annotation in mapView.annotations)
{
if (annotation != mapView.userLocation)
{
[toRemove addObject:annotation];
}
}

[mapView removeAnnotations:toRemove];

for(int i = 0; i < [toRemove count]; i++)
{
CustomMapPin * a = [toRemove objectAtIndex:i];

[a release];

a = nil;
}
}

希望这有帮助快乐编码! :)

关于iphone - 删除/添加注释到 map View 会导致内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8180513/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com