2016-05-09 22 views
1

私はiOS開発をかなり新しくしているので、この質問に私が気づいていない簡単な修正があれば申し訳ありません。デバイスの場所を取得しようとすると、iOSアプリケーションがクラッシュする - スレッド1:EXC_BAD_ACCESS

私は現在、ユーザーの現在地をアドレスとして要求するアプリケーションを作成しています。

はだからCLLLocationManagerDelegateを必ず行わクラスヘッダーに:

class SignupViewController: UIViewController, CLLocationManagerDelegate {...} 

次にIは、ロケーションマネージャのインスタンス変数を作成した:

let locationManager = CLLocationManager() 

IはまたCLLocationManagerDelegate関数を作成した:

// MARK: CLLocationManagerDelegate functions 

func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) { 
    for location in locations { 
     self.getLocationAddress(location) 
    } 
} 

func getLocationAddress(location:CLLocation) -> CLPlacemark? { 
    let geocoder = CLGeocoder() 
    print("-> Finding user address...") 
    var placemark:CLPlacemark! 
    geocoder.reverseGeocodeLocation(location, completionHandler: {(placemarks, error)->Void in 
     if error == nil && placemarks!.count > 0 { 
      placemark = placemarks![0] as CLPlacemark 
      print(location) 
      if placemark != nil { 
       print(CLPlacemark().toString(placemark)) 
      } else { 
       print("Problem with data received from geocoder") 
      } 
     } 
    }) 
    return placemark 
} 
func locationManager(manager: CLLocationManager, didFailWithError error: NSError) { 
    print("Error when updating location " + error.localizedDescription) 
} 

// MARK: Helper functions 


func getLocation() { 
    locationManager.delegate = self 
    locationManager.desiredAccuracy = kCLLocationAccuracyBest 
    locationManager.requestWhenInUseAuthorization() 
    locationManager.startUpdatingLocation() 
} 

私はまたtoString関数を定義していますCLPlacemarkの拡張:私はすべてが最初は正常に動作するように私のコードを実行すると

extension CLPlacemark { 
func toString(placemark: CLPlacemark) -> String { 
    var addressString : String = "" 
    if placemark.ISOcountryCode == "TW" /*Address Format in Chinese*/ { 
     if placemark.country != nil { 
      addressString = placemark.country! 
     } 
     if placemark.subAdministrativeArea != nil { 
      addressString = addressString + placemark.subAdministrativeArea! + ", " 
     } 
     if placemark.postalCode != nil { 
      addressString = addressString + placemark.postalCode! + " " 
     } 
     if placemark.locality != nil { 
      addressString = addressString + placemark.locality! 
     } 
     if placemark.thoroughfare != nil { 
      addressString = addressString + placemark.thoroughfare! 
     } 
     if placemark.subThoroughfare != nil { 
      addressString = addressString + placemark.subThoroughfare! 
     } 
    } else { 
     if placemark.subThoroughfare != nil { 
      addressString = placemark.subThoroughfare! + " " 
     } 
     if placemark.thoroughfare != nil { 
      addressString = addressString + placemark.thoroughfare! + ", " 
     } 
     if placemark.postalCode != nil { 
      addressString = addressString + placemark.postalCode! + " " 
     } 
     if placemark.locality != nil { 
      addressString = addressString + placemark.locality! + ", " 
     } 
     if placemark.administrativeArea != nil { 
      addressString = addressString + placemark.administrativeArea! + " " 
     } 
     if placemark.country != nil { 
      addressString = addressString + placemark.country! 
     } 
    } 
    return addressString 
} 

、これはコンソールで出力されます。

-> Finding user address... 
-> Finding user address... 
-> Finding user address... 
-> Finding user address... 
<+40.10886714,-88.23303354> +/- 10.00m (speed 0.00 mps/course 0.00) @ 5/8/16, 11:34:22 PM Central Daylight Time 
401 E John St, 61820 Champaign, IL United States 
(lldb) 

しかし、最後にそれが(lldb)でクラッシュそして表示エラースレッド1:EXC_BAD_ACCESS(コード= 1、アドレス= 0x8という) Also it is displaying the error Thread 1: EXC_BAD_ACCESS (code=1, address=0x8)

Console Screenshot

アドレスを印刷した後にアプリがクラッシュする理由についてはあまり確かではありません。

ありがとうございました!

+0

コンソールに表示されるエラーを投稿してもよろしいですか?おそらく何かが 'nil'でアクセスしようとしました。 –

+0

コンソールには何も表示されませんでした。私は私のポストにスクリーンショットを追加しました。 –

+0

NSZombiesを有効にしようとすると、いくつかのエラーが発生する可能性がありますので、[こちら](http://stackoverflow.com/questions/5386160/how-to-enable-nszombie-in-xcode)の投稿を有効にしてください。 –

答えて

1

しかし、私はこの問題を解決どの知らない、

代わりのメモリがありますので

print(CLPlacemark().toString(placemark))

print(placemark.toString(placemark))

、このようなとしてそれを呼び出すよう拡張機能を呼び出します漏れの問題。今、それはクラッシュしない。

+0

なぜ 'toString'を呼び出すのですか? 'print()'は 'placemarks'の' description'プロパティを呼び出すべきです。 –

+0

@ILikeTau actie質問者の意図は、特定のプロパティを持つ目印の値をアドレス文字列に変換することです。そのため、彼は延長を作成してその値を印刷しました –

関連する問題