1

こんにちは、次の問題で私を助けることができます: 私はその中に MKMapView を持つ ViewController を持っています。NSZombie を有効にしてこの問題を解決しようとしましたが、xcode から実行している間は問題なく動作しましたが、xcode を使用せずにシミュレーター (および iPhone) で実行しようとすると、まだクラッシュします。また、ViewWillDissapear、ViewDidDissapear、および dealloc で mapview delegate nil を作成しようとしましたが、まだ同じ問題があります。誰でもこれで私を助けることができますか?

これは、アプリがクラッシュしたときのログ出力です。

-[__NSCFTypeobservedViewControllerChange:]: インスタンス 0x79a6f50 に送信された認識されないセレクター 2012-09-14 11:28:13.878* **[456:12503] *キャッチされていない例外 'NSInvalidArgumentException' が原因でアプリを終了しています。 ]: unrecognized selector sent to instance 0x79a6f50' * First throw call stack: (0x19af022 0x179ecd6 0x19b0cbd 0x1915ed0 0x1915cb2 0x12c3a29 0x197a855 0x197a778 0x120819a 0x9d9c97 0xb810be 0xb813c7 0xb81436 0x931e49 0x931f34 0x6c0b54 0x1f2c509 0x18e6803 0x18e5d84 0x18e5c9b 0x30967d8 0x309688a 0x901626 0x46ad 0x2d55) terminate called throwing an exception(lldb)

アークを使用しています。そして、ここにいくつかのコードがあります:私はviewDidLoad関数で多くのことを行います.問題はここにあると思います.これはコードです:

これは .h:

#import <UIKit/UIKit.h>
#import <MapKit/MapKit.h>
#import <CoreLocation/Corelocation.h>
#import "AddressViewController.h"
#import "Utilities.h"
#import "MarqueeLabel.h"
#import "CustomButton.h"



@interface LocationViewController : UIViewController<MKMapViewDelegate,CLLocationManagerDelegate,UIGestureRecognizerDelegate>{
    CLLocationManager *locationManager;
    MKPointAnnotation *centerAnnotation;
    int initialState;
    NSDictionary * json;
    bool google;
    bool isBackgroundRunning;
    double x;
    CLLocationCoordinate2D selectedCoordinate;
    MarqueeLabel *continuousLabel;
    __weak IBOutlet CustomButton *cont;
    UILongPressGestureRecognizer *lgr;
    UIPanGestureRecognizer *panGesture;
    UIPinchGestureRecognizer *pinchGesture;
    UISwipeGestureRecognizer *swipeGesture;
    __weak IBOutlet UIButton *myLoc;
    BOOL first;

}
@property (strong, nonatomic) IBOutlet MKMapView *myMapView;
- (IBAction)showMe:(id)sender;
@property (strong, nonatomic) MKPointAnnotation *centerAnnotation;

@end




- (void)viewDidLoad
{
    [super viewDidLoad];
    first = YES;
    initialState = YES;
    nrGooglePosts = 0;

    [self.myMapView setShowsUserLocation:YES ];


    myMapView.centerCoordinate = myMapView.userLocation.coordinate;
    locationManager = [[CLLocationManager alloc] init];
    [locationManager setDelegate:self];
    [locationManager setDistanceFilter:kCLDistanceFilterNone];
    [locationManager setDesiredAccuracy:kCLLocationAccuracyBest];


    NSMutableArray *userL =[[NSUserDefaults standardUserDefaults] objectForKey:@"user"];
    if([userL count] == 0) NSLog(@"user nu e salvat");
    [[Utilities get] setName:[[userL valueForKey:@"name"] objectAtIndex:0]];
    [[Utilities get] setPhone:[[userL valueForKey:@"phone"] objectAtIndex:0]];
    [[Utilities get] setCode:[[userL valueForKey:@"code"] objectAtIndex:0]];
    [[Utilities get] setUserId:[[userL valueForKey:@"userid"] objectAtIndex:0]];


    centerAnnotation = [[MKPointAnnotation alloc] init];
    MKPointAnnotation * pc = [[MKPointAnnotation alloc] init];
    pc.coordinate = myMapView.centerCoordinate;
    pc.title = @"Map Center";
    pc.subtitle= [[NSString alloc] initWithFormat:@"%f, %f",pc.coordinate.latitude,pc.coordinate.longitude];    
    [self.myMapView addAnnotation:pc];
    centerAnnotation = pc;

    lgr= [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(handleGesture:)];
    lgr.minimumPressDuration=0.1;
    lgr.allowableMovement = 5;
    lgr.delegate = self ;
    [myMapView addGestureRecognizer:lgr];

    panGesture = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handleGesture:)];
    panGesture.delegate = self;
    [myMapView addGestureRecognizer:panGesture];

    pinchGesture = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(handleGesture:)];
    pinchGesture.delegate = self;
    [myMapView addGestureRecognizer:pinchGesture];

    swipeGesture = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleGesture:)];
    swipeGesture.delegate = self;
    [myMapView addGestureRecognizer:swipeGesture];


    NSMutableArray * arr=[[NSUserDefaults standardUserDefaults ] objectForKey:@"locationList"];
    if([arr count]){
        for(int i = 0 ; i < [arr count] ; i++ ){
            NSMutableDictionary * adr = [[arr objectAtIndex:i] mutableCopy];
            if(adr){
                CLLocationDegrees lat = [[adr objectForKey:@"latitude"] doubleValue] ;
                CLLocationDegrees lon = [[adr objectForKey:@"longitude"] doubleValue] ;
                CustomMKAnnotation *ann = [[CustomMKAnnotation alloc] init ];
                CLLocationCoordinate2D coord = { lat, lon };

                ann.coordinate = coord;

                ann.title = [adr objectForKey:@"street"] ;   

                ann.subtitle = [[NSString alloc] initWithFormat:@"Nr:%@  Bl:%@  Sc:%@",[adr objectForKey:@"number"],[adr objectForKey:@"bloc"],[adr objectForKey:@"scara"]];

               MKAnnotationView *aux = [[MKAnnotationView alloc] initWithAnnotation:ann reuseIdentifier:nil];  
                UIImage *poza = [UIImage imageNamed:@"star.png"];
                UIImageView *pic = [[UIImageView alloc] initWithImage:poza];
                [aux addSubview:pic];
                aux.canShowCallout = YES;
                [myMapView addAnnotation:aux.annotation];


            }

        }
    }
    google = YES;
    json = [self getLocationFromGoogleWithCoordinates:myMapView.userLocation.coordinate];
    NSString *status = [[NSString alloc] initWithFormat:@"%@",[json objectForKey:@"status"]];
    if([status compare:@"ZERO_RESULTS"] == 0 && [status compare:@"OVER_QUERY_LIMIT"] == 0)
    {
        google=NO;
        NSLog(@"%@",status);
    }

    continuousLabel = [[MarqueeLabel alloc] initWithFrame:CGRectMake(32, 20, 191, 20) rate:50.0f andFadeLength:10.0f];
    continuousLabel.marqueeType = MLContinuous;
    continuousLabel.numberOfLines = 1;
    continuousLabel.opaque = NO;
    continuousLabel.enabled = YES;
    continuousLabel.shadowOffset = CGSizeMake(0.0, -1.0);
    continuousLabel.textAlignment = UITextAlignmentLeft;

    continuousLabel.backgroundColor = [UIColor clearColor];
    continuousLabel.font = [UIFont boldSystemFontOfSize:13];
    continuousLabel.text = [[Utilities get] streetName];
    [continuousLabel setBackgroundColor:[UIColor clearColor]];
    [continuousLabel setTextColor:[UIColor whiteColor]];
    continuousLabel.opaque = NO ;
    myLoc.opaque=NO;
    [myLoc setBackgroundColor:[UIColor clearColor]];
    [self.view addSubview:continuousLabel];


    [logoutButton setTitle:@"Log Out" forState:UIControlStateNormal];
    [logoutButton addTarget:self action:@selector(logout:) forControlEvents:UIControlEventTouchUpInside];


    UIBarButtonItem *logoutBarButton = [[UIBarButtonItem alloc] initWithCustomView:logoutButton]; 
    self.navigationItem.leftBarButtonItem = logoutBarButton;


    [self.navigationController.navigationBar setBackgroundColor:[UIColor clearColor]];



}
- (void) viewWillDisappear:(BOOL)animated
{

    [self.navigationController setNavigationBarHidden:YES animated:animated];

    [self stopTrackingLocation];

    [myMapView removeAnnotations:myMapView.annotations];
      self.myMapView.delegate = nil;

      self.view = nil;
    [super viewWillDisappear:animated];
}


- (void)stopTrackingLocation
{
    if (myMapView.showsUserLocation)
    {
        // Crashes here
        myMapView.showsUserLocation = NO;
    }
}
4

1 に答える 1

1

ご覧のとおり、ARCを使用しています。

ちょっと男、これをしないでください:

self.view = NULL. //REMOVE THIS!!!!

それに関連する UIVIew がないため、UIViewController を再度プッシュすることはできません。実際にプッシュするものがないため、UINavigationController でクラッシュします。

2 番目の問題は、クラッシュはしませんが場所があります。マップ ビュー デリゲートを削除しています。ただし、このコントローラーをもう一度押すと、2 回目のマップ ビューは無効になります。

この機能を dealloc メソッドに移動する必要があります。また、このメソッドは一度だけ実行されるため、viewDidLoad: ではなく、viewWillAppear: メソッドでユーザーの位置を表示する必要があります。UIVIewController を 2 回目にプッシュしようとすると、有効になりません。したがって、この機能を変更してください:

- (void) viewWillAppear:(BOOL)animated{
     [self.myMapView setShowsUserLocation:YES ];
}

- (void) viewWillDisappear:(BOOL)animated
{

    [self.navigationController setNavigationBarHidden:YES animated:animated];

    [self stopTrackingLocation];

    [myMapView removeAnnotations:myMapView.annotations];

    [super viewWillDisappear:animated];
}

-(void) dealloc{
     self.myMapView.delegate = nil;
     //In ARC we don't call [super dealloc]
}
于 2012-09-14T08:41:52.250 に答える