ASIHttpRequest問題。 「未認識セレクタインスタンスに送信しました」
-
26-09-2019 - |
質問
私はASIHttpRequstを使用して問題が発生しています。これは私が取得エラーです。
2010-04-11 20:47:08.176 citybikesPlus[5885:207] *** -[CALayer rackDone:]: unrecognized selector sent to instance 0x464a890
2010-04-11 20:47:08.176 citybikesPlus[5885:207] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[CALayer rackDone:]: unrecognized selector sent to instance 0x464a890'
2010-04-11 20:47:08.176 citybikesPlus[5885:207] Stack: (
33936475,
2546353417,
34318395,
33887862,
33740482,
126399,
445238,
33720545,
33717320,
40085013,
40085210,
3108783,
11168,
11022
)
そして、これは私のコード(その一部)です。
// Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
- (void)viewDidLoad
{
[image setImage:[UIImage imageNamed:@"bullet_rack.png"]];
BikeAnnotation *bike = [[annotationView annotation] retain];
bike._sub = @"";
[super viewDidLoad];
NSString *newUrl = [[NSString alloc] initWithFormat:rackUrl, bike._id];
NSString *fetchUrl = [newUrl stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
[networkQueue cancelAllOperations];
[networkQueue setRequestDidFinishSelector:@selector(rackDone:)];
[networkQueue setRequestDidFailSelector:@selector(processFailed:)];
[networkQueue setDelegate:self];
ASIFormDataRequest *request = [[[ASIFormDataRequest alloc] initWithURL:[NSURL URLWithString:fetchUrl]] retain];
[request setDefaultResponseEncoding:NSUTF8StringEncoding];
[networkQueue addOperation:request];
[networkQueue go];
}
- (void)rackDone:(ASIHTTPRequest *)request
{
NSString *resultSearch = [request responseString];
NSData *data = [resultSearch dataUsingEncoding:NSUTF8StringEncoding];
NSString *errorDesc = nil;
NSPropertyListFormat format;
NSDictionary * dict = (NSDictionary*)[NSPropertyListSerialization
propertyListFromData:data
mutabilityOption:NSPropertyListMutableContainersAndLeaves
format:&format
errorDescription:&errorDesc];
rackXmlResult* fileResult = [[[rackXmlResult alloc] initWithDictionary:dict] autorelease];
rackXmlSet *rackSet = [fileResult getRackResult];
NSString *subString = [[NSString alloc] initWithFormat:@"Cyklar tillgängligt: %@ -- Lediga platser: %@", rackSet._ready_bikes, rackSet._empty_locks];
[activity setHidden:YES];
[image setHidden:NO];
BikeAnnotation *bike = [annotationView annotation];
bike._sub = subString;
}
- (void) processFailed:(ASIHTTPRequest *)request
{
UIAlertView *errorView;
NSError *error = [request error];
NSString *errorString = [error localizedDescription];
errorView = [[UIAlertView alloc]
initWithTitle: NSLocalizedString(@"Network error", @"Network error")
message: errorString
delegate: self
cancelButtonTitle: NSLocalizedString(@"Close", @"Network error") otherButtonTitles: nil];
[errorView show];
[errorView autorelease];
}
注釈が私のMapViewにロードされたときに、プロセスがコールアウトバブルにLeftCalloutViewとしてロードされているので、かなり多く(80回程度)。 サーバーからXML plistのを取得し、それを解析し、データを使用するためのもの...それはrackDoneで死ぬされます:
ないの誰もが任意のアイデアがありますか?
よろしく、 ポール・Peelen
解決 2
私は[self retain]
を使用して解決策を見つけました。私がそう頻繁にオブジェクトをロードするので、それはrackDoneを受信する自己十分な長さを割り当てないようです:アクション
これが動作するようになりました。アプリがロードされたときに今、私はちょうど、私がリクエストに応じてこれをロードすることができる方法を把握する必要はありません。
他のヒント
さて、問題は、あなたのnetworkQueue
オブジェクト(つまりNSOperationsQueueサブクラスである何?)代わりのViewController自体ののViewControllerのビューにrackDone:
メッセージを送信していることであるように思われます。エラーがビューから来る必要があるので、CALayersは、ビューの属性ではないviewControllersです。
networkQueue
のコードをチェックします。
またself
ためnetworkQueue
表記を使用していないようですし、それが適切に保持されていないため、クラスのその性質た場合には、警告なしに死ぬことがあります。