2011-11-25 327 views
0

我知道这是一个非常愚蠢的问题,但我有一个视图控制器,其中有一个mapview和一些uibuttons我已经做了每一个thng以消除所有的泄漏bt仍然2-3后切换两控制器应用程序崩溃。以下是分配和解除分配的代码。 BTW我没有得到任何 “没有recive memoru警告” ..日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 
+7

发布崩溃日志和堆栈跟踪。此外,泄漏不会导致崩溃,过度释放。打开NSZombies以帮助查找与内存相关的崩溃,并添加异常断点。 – zaph

+0

我没有得到任何日志除了 (gdb).. – iPhoneDev

+1

不是你的崩溃的解释,但:你不释放中viewDidUnload - 是故意的?另外,你应该释放dealloc中的所有内容,而不仅仅是mapView和placeName。无论如何,就像@CocoaFu所说的那样,泄漏本身不会导致崩溃。除了这段代码,你还没有在这个课上有什么其他的... –

回答

2

下只适用于模拟器没有设备...


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

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

profile

现在选择僵尸。这个工具就在你要使用一个释放对象的时候发出警告,这个对象会导致一个不好的访问。

zombies!

现在检测到一个僵尸,当你使用这些工具,你可以看到该对象的生命周期会看到这样的事情(减去annotatios!)。双击该代码。

enter image description here

希望它可以帮助别人!

+0

我无法找到配置文件 – iPhoneDev

+2

菜单中的僵尸您需要在模拟器上运行而不是设备来查看僵尸选项。另外,请确保您拥有最新版本的XCode。 – Robert

0

我会建议申报模式视图控制器(objCont)作为autorelease而不是手动释放它们。