私は、リストされた "ホーム"場所または現在の場所(CLLocationManagerを使用)のいずれかに基づいてストアをリストするUIPickerViewオブジェクトを持っています。後者が実装されている場合は、NSMutableURLRequestを自分のサーバーに作成して最も近いストアを取得し、受信したリストでUIPickerViewを更新します。CLLocationManagerはこのクラッシュを引き起こしていますか?
時には(私が "ホーム"の場所にいるときに決して奇妙なことに)、私は現在の場所を使用します。ピッカーがリストを更新するのを見て、すぐにアプリがクラッシュします。
マイピッカーコードは十分に単純です:
-(NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView{
return 1;
}
-(NSInteger) pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component {
if (isHome) {
return [storesData count];
} else {
return [storesDataLoc count];
}
}
-(NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component {
if (isHome) {
return [[storesData objectAtIndex:row] objectForKey:@"STName"];
} else {
return [[storesDataLoc objectAtIndex:row] objectForKey:@"STName"];
}
}
一つの考えは、第2、より正確な読みを提供していたことを、私は私はすでにリリースされている可能性が何かを解放したということでした。
- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error {
if (error.code == kCLErrorLocationUnknown) {
NSLog(@"Currently unable to retrieve location");
} else if (error.code == kCLErrorNetwork) {
NSLog(@"Network used to retrieve location is unavailable");
} else if (error.code == kCLErrorDenied) {
NSLog(@"Permission to retrieve location is denied");
[locMan stopUpdatingLocation];
[locMan release];
locMan = nil;
// revert segmented controller to Home position
storeSource.selectedSegmentIndex = 0;
}
if(loadstoresconnection!=nil){
[loadstoresconnection release];
}
networkView.hidden = TRUE;
isHome = TRUE;
}
- (void)locationManager:(CLLocationManager *)manager
didUpdateToLocation:(CLLocation *)newLocation
fromLocation:(CLLocation *)oldLocation {
if (newLocation.horizontalAccuracy >= 0) {
networkView.hidden = TRUE;
if (newLocation.horizontalAccuracy < 200) {
[locMan stopUpdatingLocation];
[locMan release];
locMan = nil;
}
//call for store list from this location
NSString *myString = [NSString stringWithFormat:@"http://mywebsite.com/?lat=%f&lng=%f",newLocation.coordinate.latitude,newLocation.coordinate.longitude];
NSURL *myURL = [[NSURL alloc] initWithString:[myString stringByAddingPercentEscapesUsingEncoding:NSASCIIStringEncoding]];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:myURL cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:60];
loadstoresconnection = [[NSURLConnection alloc] initWithRequest:request delegate:self];
}
}
と関連NSMutableURLRequest方法は以下のとおりです:私のCLLocationManagerコードがある
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error {
[responseData release];
[connection release];
networkView.hidden = TRUE;
isHome = YES;
// [textView setString:@"Unable to fetch data"];
}
- (void)connectionDidFinishLoading:(NSURLConnection *)connection {
int i;
NSArray *querydata;
networkView.hidden = TRUE;
[loadstoresconnection release];
if (storesDataLoc!=nil) {
[storesDataLoc release];
storesDataLoc = nil;
}
storesDataLoc = [[NSMutableArray alloc] init];
NSString *txt = [[[NSString alloc] initWithData:responseData encoding: NSASCIIStringEncoding] autorelease];
[responseData release];
// put data into variables.
querydata = [txt componentsSeparatedByString:@"<-sl->"];//break up data into data sections: 0 - number of deptsections and names, 1 - list of objects
NSArray *allstoreinfo;
for (i=0; i<[querydata count]; i++) {
allstoreinfo = [[querydata objectAtIndex:i] componentsSeparatedByString:@"<-as->"];
[storesDataLoc addObject:[[[NSMutableDictionary alloc] initWithObjectsAndKeys:[allstoreinfo objectAtIndex:0],@"STid",[allstoreinfo objectAtIndex:1],@"STName",[allstoreinfo objectAtIndex:2],@"STAddr",nil] autorelease]];
}
if ([querydata count]>0) {
[pickerView reload];
[pickerView selectRow:0 inComponent:0 animated:NO];
isHome = NO;
}
}
イム私はちょうどクラッシュする前に更新されてピッカーを見ることができる理由として好奇心。これは私が道路上にいるときに起こるので、正確なことだと思っています。ロケーションマネージャーはクラッシュの原因となる2番目の結果を送信しています。何かご意見は?
私はすべてのあなたの位置変数がプロパティであると仮定しています。あなたがエラーの間にそれらをすべて解放している理由はありますか? deallocまで解放しないでください。あなたはLocationをうまく停止することはできますが、ビューを終了するまでは変数を保持しています。 –
こんにちはビル、返事ありがとう - 私は同じクラスで、私はユーザーが "現在の場所"ボタンをもう一度押すべき新しいインスタンスを作成していたので、それらを解放していた。私は正しくカプセル化されていないので、それ以来各GPS呼び出しを独自のクラスに入れてから実現しました。 Anyhoo - これが物事が解放された理由です。あなたのご意見ありがとうございます! –