2011-11-25 3 views
0

나는 이것이 매우 바보 같은 질문을 알고 있지만 그것에 mapview 및 일부 uibuttons 가지고있는보기 컨트롤러를 가지고 모든 thng 두 bt 여전히 2-3 사이에 토글 후 제거하려면 컨트롤러 앱이 다운됩니다. 아래는 할당 및 dellocation에 대한 코드입니다. BTW 내가 Thnx이가능한 메모리 누수

.H/

을 alot을 ... 어떤 "받아 봐 memoru 경고했다"얻을 해달라고
@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의 중간 부분을 릴리스하지 않습니다. 의도적입니까? 또한 mapView 및 placeName뿐 아니라 dealloc의 모든 항목을 릴리스해야합니다. 어쨌든 코코아 푸 (@ 코코아 푸)처럼 누출 자체가 충돌을 일으키지 않을 것이라고 말했다. 이 코드 외에도이 클래스에는 다른 것이 없습니까? ... –

답변

2

다음은 여기에


좀비를 사용하여 나쁜 액세스 오류를 찾기위한 좋은 방법입니다 ... 장치의 시뮬레이터하지에서 작동합니다. 모든 도구는 Xcode에 내장되어 있습니다.

처음으로 프로파일 링을 변경합니다. 실행 버튼을 클릭 한 상태로 유지하십시오.

profile

이제 좀비를 선택합니다. 이 도구는 할당되지 않은 객체를 사용하기 직전에 경고를 표시합니다. 다른 객체는 잘못된 액세스를 유발합니다. 좀비가 감지 될 때

zombies!

이제 당신은 다음과 같이 표시됩니다 (마이너스 annotatios를!) 당신은 객체의 라이프 사이클을 볼 수있는 도구를 사용하여. 코드를 보려면 두 번 클릭하십시오.

enter image description here

은 사람을 도움이되기를 바랍니다!

+0

프로파일의 메뉴에서 좀비를 찾을 수 없습니다 – iPhoneDev

+2

좀비 옵션을 보려면 장치가 아닌 시뮬레이터에서 실행해야합니다. 또한 최신 버전의 Xcode가 설치되어 있는지 확인하십시오. – Robert

0

내가 모달 뷰 컨트롤러 (objCont)를 선언 제안 등 수동으로 해제하는 것과는 달리 autorelease.