I've boiled a very complex set of web services and searches down to the simple following code. I need to be able to add annotations to a map in response to a search (or in the sample below to the click of a button), then allow the user to click the button again and get a new set of results. In reality there will be a different number, but in the simplified example, we always add one annotation to the mapview. I believe my code should remove the existing annotations and add a new one, but it leaks 32 bytes on second and subsequent button pushes. What am I missing ? (Or retaining as the case may be!)
testViewController.h
#import <UIKit/UIKit.h>
#import <MapKit/MapKit.h>
#import "MyMark.h"
@interface testViewController : UIViewController {
MKMapView *mapView;
}
@end
testViewController.m
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
if (self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]) {
// Custom initialization
self.title=@"test";
}
return self;
}
- (void) storeLocationInfo: (CLLocationCoordinate2D) loc title:(NSString *)t subtitle:(NSString *)st index:(int)i {
NSArray * annotations = [mapView annotations];
[mapView removeAnnotations:annotations];
MyMark * mymark=[[MyMark alloc] initWithCoordinate:loc];
[mapView addAnnotation:mymark];
[MyMark release];
}
- (void)viewDidLoad {
[super viewDidLoad];
UIBarButtonItem *barButton = [[UIBarButtonItem alloc] initWithTitle:@"Add point to map" style:UIBarButtonItemStylePlain target:self action:@selector(addPushed)];
[self.navigationItem setRightBarButtonItem:barButton];
[barButton release];
mapView=[[MKMapView alloc] initWithFrame:CGRectMake(0.0,0.0,self.view.frame.size.width,self.view.frame.size.height)];
mapView.showsUserLocation=FALSE;
mapView.delegate=self;
[self.view insertSubview:mapView atIndex:0];
[mapView release];
}
- (void) addPushed {
MKCoordinateRegion reg = mapView.region;
[self storeLocationInfo:reg.center title:@"price" subtitle:@"title" index:1];
}
- (void)dealloc {
[super dealloc];
}
MyMark.h
#import <Foundation/Foundation.h>
#import <MapKit/MapKit.h>
@interface MyMark : NSObject<MKAnnotation> {
CLLocationCoordinate2D coordinate;
NSString * title;
NSString * subtitle;
int index;
}
@property (nonatomic, readonly) CLLocationCoordinate2D coordinate;
@property (nonatomic, readonly) int index;
@property (nonatomic, retain) NSString * title;
@property (nonatomic, retain) NSString * subtitle;
-(id)initWithCoordinate:(CLLocationCoordinate2D) coordinate;
-(id)setCoordinate:(CLLocationCoordinate2D) coordinate;
-(id)setTitle:(NSString *)t subtitle:(NSString *)st index:(int)i ;
@end
MyMark.m
#import "MyMark.h"
@implementation MyMark
@synthesize coordinate, index;
@synthesize title,subtitle;
-(id)initWithCoordinate:(CLLocationCoordinate2D) c{
coordinate=c;
NSLog(@"%f,%f",c.latitude,c.longitude);
return self;
}
-(id)setCoordinate:(CLLocationCoordinate2D) c{
coordinate=c;
NSLog(@"%f,%f",c.latitude,c.longitude);
return self;
}
-(id)setTitle:(NSString *)t subtitle:(NSString *)st index:(int) i{
self.title=t;
self.subtitle=st;
index=i;
return self;
}
-(void) dealloc {
[title release];
[subtitle release];
[super dealloc];
}