可能的内存泄漏

时间:2011-11-25 14:34:24

标签: iphone objective-c uiviewcontroller mkmapview

我知道这是一个非常愚蠢的问题,但我有一个视图控制器,里面有一个mapview和一些uibuttons我已经做了每一个消除所有泄漏bt仍然在两个控制器应用程序崩溃之间2-3切换。以下是分配和解除分配的代码。顺便说一下,我没有得到任何“确实收到记忆警告”...... Thnx很多

·H /

@interface MapView : BaseViewController <MKMapViewDelegate,MKAnnotation> {

    MKMapView *mapView;
    NSMutableArray *placeName;
    NSString *mid;
    UISegmentedControl *segmentedControl;
    IBOutlet UILabel *numberofbeeps;
    NSInteger badgenumber;
}
@property (nonatomic, retain) UILabel *numberofbeeps;
@property(nonatomic, retain) NSString *mid;
@property (nonatomic, retain) IBOutlet MKMapView *mapView;
@property(nonatomic,retain) NSMutableArray *placeName;
@property (nonatomic,retain) IBOutlet UISegmentedControl *segmentedControl;


-(IBAction)refreshButtonPressed:(id)sender;

-(IBAction) segmentedControlIndexChanged;
-(IBAction)SignUpButtonPressed:(id)sender;
-(IBAction)BackButtonPressed:(id)sender;
-(IBAction)AddBeepButtonPressed:(id)sender;
-(id)initWithAnnotation:(id ) annotation;
-(IBAction)sliderChanged:(id)sender;
-(IBAction)MyAccountPageButtonPressed:(id)sender;
-(IBAction)MyBeepsButtonPressed:(id)sender;

@end

的.m /

    -(void)network:(WNetwork*)network didFinishLoadingWithRequest:(NSInteger)pReq data:(NSMutableDictionary*)pData
{
    [self removeLoader];

    switch (pReq) {
        case JBJsonParser:
        {

            NSMutableArray *array = [NSMutableArray new];
            self.placeName = array;
            [array release];


            self.placeName = pData;



            badgenumber = [placeName count];

                NSString *checkstring = [[AppHelper mDataManager] objectForKey:@"numberofbeepsnearby"];


            NSInteger check = [checkstring intValue];

            switch (check) {
                case 0:
                {
                    self.numberofbeeps.text =[NSString stringWithFormat:@"No beeps found nearby. Why not beep something?"];
                    NSLog(@"%@",checkstring);
                }
                    break;
                case 1:
                {

                    self.numberofbeeps.text =[NSString stringWithFormat:@"%@ beep found nearby! %d beeps worldwide.",checkstring,badgenumber];
                    NSLog(@"%@",checkstring);
                }
                    break;

                default:
                {
                    self.numberofbeeps.text =[NSString stringWithFormat:@"%@ beeps found nearby! %d beeps worldwide.",checkstring,badgenumber];
                    NSLog(@"%@",checkstring);
                }
                    break;
            }

            if ([placeName count])
            {
                for (int i =0; i < [placeName count]; i++) 
                {
                    NSDictionary *dict  = [placeName objectAtIndex:i];

                    CLLocationCoordinate2D coordinatemain;
                    coordinatemain.latitude = [[dict objectForKey:@"Lat"] doubleValue];
                    coordinatemain.longitude = [[dict objectForKey:@"long"] doubleValue];

                    DLog(@"id of Beeps %@", mid);

                    NSString *username = [NSString stringWithFormat:@"by %@",[dict objectForKey:@"username"]];
                    MyAnnotation *ann = [[MyAnnotation alloc] init];

                    ann.title = [dict objectForKey:@"beep"];

                    ann.subtitle = username;
                    ann.beepid=[dict objectForKey:@"beepid"];
                    ann.coordinate = coordinatemain;
                    ann.coordinate.latitude == [[dict objectForKey:@"Lat"] doubleValue];
                    ann.coordinate.longitude == [[dict objectForKey:@"long"] doubleValue];
                    [mapView addAnnotation:ann];
                    [ann release];

                }
            }





        }

            break;

        default:
            break;
    }

}



-(IBAction) segmentedControlIndexChanged{

    switch (self.segmentedControl.selectedSegmentIndex) {

        case 0:

        {   
            Screen1 *objCont = [[Screen1 alloc] initWithNibName:@"Screen1" bundle:nil];
            objCont.modalTransitionStyle = UIModalTransitionStyleCrossDissolve;
            [self presentModalViewController: objCont animated: YES];
            [objCont release];
        }
            break;

        case 1:
        {

            MapView *objCont = [[MapView alloc] initWithNibName:@"MapView" bundle:nil];
            objCont.modalTransitionStyle = UIModalTransitionStyleCrossDissolve;
            [self presentModalViewController: objCont animated: YES];
            [objCont release];


        }
            break;



        default:

            break;

    }

}
#pragma mark -
#pragma mark request delegates
-(void)makeAccomodationRequest
{


    NSMutableDictionary *paramDic = [[NSMutableDictionary alloc] init];


    [self.mWNetowrk makeRequsetWithURL:URL_Showbeepsmap type:JBJsonParser paramDictionary:paramDic delegate:self];
    [paramDic autorelease];
}

-(BOOL)network:(WNetwork*)network shouldStartForRequest:(NSInteger)pReq
{
    [self addLoaderWithtext:@"Loading"];


    return YES;
}

-(void)network:(WNetwork*)network didFailForRequest:(NSInteger)pReq WithError:(NSString*)error
{
    [AppHelper showAlert:error];
    [self removeLoader];
}



-(void)initializeView
{
    [self initializeOutlets];
    [self makeAccomodationRequest];

}
-(void)initializeOutlets
{
}


-(IBAction)BackButtonPressed:(id)sender
{
    Screen1 *objCont = [[Screen1 alloc] initWithNibName:@"Screen1" bundle:nil];
    objCont.modalTransitionStyle = UIModalTransitionStyleCrossDissolve;
    [self presentModalViewController: objCont animated: YES];
    [objCont release];

}

-(IBAction)refreshButtonPressed:(id)sender
{
    MapView *objCont = [[MapView alloc] initWithNibName:@"MapView" bundle:nil];
    objCont.modalTransitionStyle = UIModalTransitionStyleCrossDissolve;
    [self presentModalViewController: objCont animated: YES];
    [objCont release];


}
-(IBAction)MyAccountPageButtonPressed:(id)sender
{

    NSString *sid = [[AppHelper mDataManager] objectForKey:@"logout"];


    {
        NSDecimalNumber *session = [[AppHelper mDataManager] objectForKey:@"sid"];
        if ([sid isEqualToString:@"logged out"]||session==NULL) {



            AddPlace *objCont = [[AddPlace alloc] initWithNibName:@"AddPlace" bundle:nil];
            objCont.modalTransitionStyle = UIModalTransitionStyleCrossDissolve ;
            [self presentModalViewController: objCont animated: YES];
            [objCont release];

        }

        else {

            MyAccountPage *objCont = [[MyAccountPage alloc] initWithNibName:@"MyAccountPage" bundle:nil];
            objCont.modalTransitionStyle = UIModalTransitionStyleCrossDissolve ;
            [self presentModalViewController: objCont animated: YES];
            [objCont release];

        }



    }

}
-(IBAction)MyBeepsButtonPressed:(id)sender
{


    NSString *sid = [[AppHelper mDataManager] objectForKey:@"logout"];
    NSDecimalNumber *session = [[AppHelper mDataManager] objectForKey:@"sid"];
    //NSString *sessionStr = [session stringValue]; 
    if ([sid isEqualToString:@"logged out"]||session==NULL) {

        [[AppHelper mDataManager] setValue:@"MyBeeps" forKey:@"appflow"];
        AddPlace *objCont = [[AddPlace alloc] initWithNibName:@"AddPlace" bundle:nil];
        objCont.modalTransitionStyle = UIModalTransitionStyleCrossDissolve ;
        [self presentModalViewController: objCont animated: YES];
        [objCont release];


    }

    else {


        MyBeeps1 *objCont = [[MyBeeps1 alloc] initWithNibName:@"MyBeeps1" bundle:nil];
        objCont.modalTransitionStyle = UIModalTransitionStyleCrossDissolve ;
        [self presentModalViewController: objCont animated: YES];
        [objCont release];
    }

}
-(IBAction)AddBeepButtonPressed:(id)sender
{
    NSString *sid = [[AppHelper mDataManager] objectForKey:@"logout"];
    NSDecimalNumber *session = [[AppHelper mDataManager] objectForKey:@"sid"];


    if([sid isEqualToString:@"logged out"]||session==NULL) {


        [[AppHelper mDataManager] setValue:@"Addabeep" forKey:@"appflow"];
        AddPlace *objCont = [[AddPlace alloc] initWithNibName:@"AddPlace" bundle:nil];
        objCont.modalTransitionStyle = UIModalTransitionStyleCrossDissolve ;
        [self presentModalViewController: objCont animated: YES];
        [objCont release];
    }

    else {
        [[AppHelper mDataManager] setValue:@"Addabeep" forKey:@"appflow"];
        Check20M *objCont = [[Check20M alloc] initWithNibName:@"Check20M" bundle:nil];
        objCont.modalTransitionStyle = UIModalTransitionStyleCrossDissolve ;
        [self presentModalViewController: objCont animated: YES];
        [objCont release];  



    }


}


#pragma mark -

#pragma mark MKMapViewDelegate

- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation
{

    if (annotation == mapView.userLocation) {
        //  NSLog(@"nil");
        return nil; }



    MKPinAnnotationView *pinView = nil;

    static NSString *defaultPinID = @"com.invasivecode.pin";
    pinView = (MKPinAnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:defaultPinID];




    if ( pinView == nil )
        pinView = [[[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:defaultPinID] autorelease];
    pinView.pinColor = MKPinAnnotationColorGreen;
    pinView.frame=CGRectMake(0, 0, 30, 30);
    pinView.canShowCallout = YES;
    pinView.animatesDrop = YES;


    UIButton *infoButton = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];
    MyAnnotation *temp =  (MyAnnotation*)annotation;
    infoButton.tag   = [temp.beepid integerValue];
    [infoButton addTarget:self action:@selector(showDetails:) forControlEvents:UIControlEventTouchUpInside];
    pinView.rightCalloutAccessoryView = infoButton;
    [defaultPinID release];

    return pinView;
}



-(IBAction)showDetails:(id)sender{

    UIButton *button = (UIButton*)sender    ;

    NSLog(@"Annotation Click");


    BeepsDetail *objCont = [[BeepsDetail alloc] initWithNibName:@"BeepsDetail" bundle:nil];
    objCont.mId = [NSString stringWithFormat:@"%d",button.tag];
    objCont.modalTransitionStyle = UIModalTransitionStyleCrossDissolve;
    [self presentModalViewController: objCont animated: YES];

    [objCont release];

}


#pragma mark -
#pragma mark mapView delegates
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {

}
return self;
}

- (void)viewDidLoad
{
    [super viewDidLoad];
    mapView.delegate = self;
    [self initializeView];
    mapView.showsUserLocation = YES;

    [self makeAccomodationRequest];


    CLLocation *location = [[AppHelper appDelegate] mLatestLocation];
    MKCoordinateRegion region; 
    region.center.latitude = location.coordinate.latitude;

    region.center.longitude =   location.coordinate.longitude;

    region.span.latitudeDelta = 0.001; 

    // Add a little extra space on the sides 
    region.span.longitudeDelta = 0.001;

    // Add a little extra space on the sides 
    region = [mapView regionThatFits:region]; 
    [mapView setRegion:region animated:YES]; 








}

// Listen to change in the userLocation

- (void)viewDidUnload
{

    [super viewDidUnload];
    // Release any retained subviews of the main view.
    // e.g. self.myOutlet = nil;
    self.mapView = nil;
    self.numberofbeeps =nil;
    self.mapView = nil;
    self.segmentedControl = nil;
}
- (void)dealloc
{
    [mapView release];
   // [self.mapView removeFromSuperview]; 
    [placeName release];
    //[mid autorelease];
    [super dealloc];


}
- (void)didReceiveMemoryWarning {
    // Releases the view if it doesn't have a superview.
    [super didReceiveMemoryWarning];

    // Release any cached data, images, etc. that aren't in use.
}




@end

2 个答案:

答案 0 :(得分:2)

以下内容仅适用于模拟器而不适用​​于设备......


这是使用僵尸查找错误访问错误的好方法。所有工具都内置在Xcode中。

首先更改为分析。单击并按住一个运行按钮。

profile

现在选择僵尸。这个工具就在您打算使用一个解除分配的对象之前就会发出警告,否则会导致访问不良。

zombies!

现在,当检测到僵尸时,你会看到类似这样的东西(减去annotatios!),使用你可以看到对象生命周期的工具。双击以获取代码。

enter image description here

希望它有所帮助!

答案 1 :(得分:0)

我建议将模态视图控制器(objCont)声明为自动释放,而不是手动释放它们。