2011-09-16 218 views
1

首先,將免責聲明我針對的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之前還需要做什麼嗎?

回答

10

ARC在getZipCode方法調用後解除分配新創建的對象。

+0

是的,這似乎是 - 關閉自動引用計數解決了問題。任何想法如何防止它釋放位置管理器對象? – blabus

+0

編譯器會在你的調用之後生成一個'[zipCodeFetcher release]'。使用一個屬性來保持對它的強烈參考。 –

+0

完美工作 - 謝謝! – blabus

0

我還沒有使用ARC,所以我不確定你的頭文件的語法(readwrite與read write)。但我會把一個NSLog(@「我的本地經理是%@」,self.locationManager); getZipCode內部只是爲了確保你有一個,它沒有被髮布之前,它有機會做任何事情。

+1

是的,它確實記錄什麼似乎是一個有效的CLLocationManager對象。我也試過(非原子,保留)的位置管理器屬性,但仍然沒有。 – blabus

+0

嗯。我唯一能想到的其他事情就是擺弄配置,設置爲\t \t self.locManager.desiredAccuracy = kCLLocationAccuracyBest;和\t \t self.locManager.distanceFilter = kCLDistanceFilterNone; – Rayfleck

相關問題