0

TestFlightは、複製できないアプリケーションのクラッシュを識別しましたが、それを修正する必要があるほど十分に発生しています。このエラーはunrecognized selector sent to instance 0x34a9e0、GCによって削除されたオブジェクトにlocationIdを割り当てようとしたときに発生すると考えられます。

-[UIViewAnimationState locationId]: unrecognized selector sent to instance 0x34a9e0

0 CoreFoundation 0x371e488f __exceptionPreprocess + 163
1 libobjc.A.dylib 0x34ee9259 objc_exception_throw + 33
2 CoreFoundation 0x371e7a9b -[NSObject doesNotRecognizeSelector:] + 175
3 CoreFoundation 0x371e6915 ___forwarding___ + 301
4 CoreFoundation 0x37141650 _CF_forwarding_prep_0 + 48
5 Skate Spots 0x0000b9b9 -[DetailViewController handlePhotosButtonClick:] (DetailViewController.m:92)
6 CoreFoundation 0x3713e3fd -[NSObject performSelector:withObject:withObject:] + 53
7 UIKit 0x30ed3e07 -[UIApplication sendAction:to:from:forEvent:] + 63
8 UIKit 0x30ed3dc3 -[UIApplication sendAction:toTarget:fromSender:forEvent:] + 31
9 UIKit 0x30ed3da1 -[UIControl sendAction:to:forEvent:] + 45
10 UIKit 0x30ed3b11 -[UIControl(Internal) _sendActionsForEvents:withEvent:] + 493
11 UIKit 0x30ed4449 -[UIControl touchesEnded:withEvent:] + 477
12 UIKit 0x30ec6b87 _UIGestureRecognizerUpdate + 5223
13 CoreFoundation 0x371b8b1b __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ + 19
14 CoreFoundation 0x371b6d57 __CFRunLoopDoObservers + 259
15 CoreFoundation 0x371b70b1 __CFRunLoopRun + 761
16 CoreFoundation 0x3713a4a5 CFRunLoopRunSpecific + 301
17 CoreFoundation 0x3713a36d CFRunLoopRunInMode + 105
18 GraphicsServices 0x338f9439 GSEventRunModal + 137
19 UIKit 0x30ee6cd5 UIApplicationMain + 1081
20 Skate Spots 0x0000325f -[Image willSendWithObjectLoader:] (Image.m:83)
21 Skate Spots 0x00002b18 + 0

元のコード:

自動リリースは、このメソッドのスコープ中に参照を保持すると想定しました。

-(IBAction)handlePhotosButtonClick:(id)sender
{
  PhotosViewController *vc = [[[PhotosViewController alloc] init] autorelease];
  vc.locationID            = _location.locationId;
  [self.navigationController pushViewController:vc animated:YES];
}

私のコード変更:

これで元のエラーがなくなると思いますが、これは正しい方法ですか?

-(IBAction)handlePhotosButtonClick:(id)sender
{
  NSLog(@"handlePhotosButtonClick");    
  PhotosViewController *vc = [[[PhotosViewController alloc] init] retain];
  vc.locationID            = _location.locationId;

  [self.navigationController pushViewController:vc animated:YES];
  [vc release];
}

編集

あなたたちは正しいです_locationは値を保持するように設定されていませんでした。

@property (nonatomic, readwrite, assign) RKLocation *location;

4

3 に答える 3

1
PhotosViewController *vc = [[[PhotosViewController alloc] init] retain]; // <--- this is over retaining and it's totally wrong, because init method returns an already retained object.

エラーはあなた_location.locationIdのと関係があり、それはのゲッターを呼び出し、_locationある時点であなたはおそらくそれを解放しました。のライフサイクルについてコードを確認してください。_locationまた、インスタンス変数よりもプロパティを使用することをお勧めします。

于 2012-05-20T18:22:25.687 に答える
0
-[UIViewAnimationState locationId]: unrecognized selector sent to instance 0x34a9e0

したがって、送信されるセレクターは、setLocationId :(セッター)ではなく、locationId(ゲッター)です。つまり、自動解放されたオブジェクト(この場合はView Controller)がエラーの原因ではありません。これは、プロパティをSETして、ランタイムがsetLocationId:を呼び出すためです。どこかで割り当てが解除されているオブジェクトを評価し_location、次に別のオブジェクトがそのポインターを引き継ぎ(この特定のケースではUIViewAnimationStateでした)、もちろん、locationIdゲッターに応答しません。プロパティが必要になるまで_locationId変数の割り当てが解除されないように、コードを修正してみてください。

于 2012-05-20T18:17:32.243 に答える
0

あなたのコードに関しては、あなたの元のコードはあなたが望むものに近かった。特に、最終的なコードは次のとおりです。

-(IBAction)handlePhotosButtonClick:(id)sender
{
    NSLog(@"handlePhotosButtonClick");    
    PhotosViewController *vc = [[[PhotosViewController alloc] init] retain];
    vc.locationID            = _location.locationId;

    [self.navigationController pushViewController:vc animated:YES];
    [vc release];
}

間違いなく間違っており、リークが発生します。そのはず:

-(IBAction)handlePhotosButtonClick:(id)sender
{
    NSLog(@"handlePhotosButtonClick");    
    PhotosViewController *vc = [[PhotosViewController alloc] init];
    vc.locationID            = _location.locationId;

    [self.navigationController pushViewController:vc animated:YES];
    [vc release];
}

これは、を使用した元のバージョンと似ていますが、通常は延期する必要がある場合autoreleaseにのみ使用する必要があるため、これは優れています(この場合は使用しません)。autoreleaserelease

問題はViewControllerの保持数ではなく、間違いなくlocationID自体に関連しています。その宣言(PhotosViewControllerクラスと現在のクラス内)を私たちと共有できますか?それは何ですか?それはどのように宣言されましたか?

于 2012-05-20T18:29:21.937 に答える