首先,將免責聲明我針對的iOS 5,所以這非常可能是我的問題的根源,但如果沒有...CLLocationManager不調用任何委託方法
我想寫一個簡單的類,通過CoreLocation管理位置更新。但是,我看到一些非常奇怪的行爲。我有一個基本上包裝CLLocationManager和委託方法的自定義類。這是接口:
#import <Foundation/Foundation.h>
#import <CoreLocation/CoreLocation.h>
@protocol CLZipCodeFetcherDelegate
@optional - (void)didReceiveZipCode:(NSString *)zipCode;
@end
@interface CLZipCodeFetcher : NSObject <CLLocationManagerDelegate> {
id <CLZipCodeFetcherDelegate> delegate;
CLLocationManager *locationManager;
}
@property (strong, readwrite) id <CLZipCodeFetcherDelegate> delegate;
@property (strong, read write) CLLocationManager *locationManager;
- (void)getZipCode;
@end
和執行(忽略stuff-對涉及郵政編碼就是類是最終的意思做,但現在我只是想獲得一些座標從CoreLocation回來):
#import "CLZipCodeFetcher.h"
@implementation CLZipCodeFetcher
@synthesize delegate, locationManager;
- (id) init {
self = [super init];
if (self != nil) {
self.locationManager = [[CLLocationManager alloc] init];
self.locationManager.delegate = self;
self.locationManager.distanceFilter = 10.0f; // we don't need to be any more accurate than 10m
self.locationManager.desiredAccuracy = kCLLocationAccuracyThreeKilometers;
self.locationManager.purpose = @"Retrieve zip code";
}
return self;
}
- (void)getZipCode {
[self.locationManager startUpdatingLocation];
}
- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation {
NSLog(@"Received location");
}
- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error {
NSLog(@"Location failed");
}
@end
然後,我在我的視圖控制器初始化類的一個實例,並調用方法:
CLZipCodeFetcher *zipCodeFetcher = [[CLZipCodeFetcher alloc] init];
[zipCodeFetcher getZipCode];
現在,當我運行此,應用程序需要一段時間來加載,然後彈出警告對話框詢問是否允許應用程序使用位置服務。但是,一旦它出現,它立即消失(太快而不能讓我點擊允許或拒絕按鈕),並且什麼都沒有發生(沒有委託方法被調用)。如果我然後進入設備的位置設置,它確實爲我的應用顯示「關閉」。當我從該屏幕手動打開它,然後再次嘗試應用程序時,不會出現警告對話框,但仍然沒有任何反應。我的調試消息都沒有記錄。模擬器和我的iPhone 4的行爲是相同的。
所以基本上,任何人都有任何想法爲什麼?我查看了所有類似的線程,許多問題都與內存管理有關,但我認爲這不會成爲問題,因爲ARC應該管理我的CLLocationManager對象,對吧?
P.S.另外,我確實將CoreLocation框架添加到了我的項目中,並且我沒有收到任何代碼錯誤或警告,但是在我的應用程序中使用CoreLocation之前還需要做什麼嗎?
是的,這似乎是 - 關閉自動引用計數解決了問題。任何想法如何防止它釋放位置管理器對象? – blabus
編譯器會在你的調用之後生成一個'[zipCodeFetcher release]'。使用一個屬性來保持對它的強烈參考。 –
完美工作 - 謝謝! – blabus