0

私は最初のiPhoneアプリで作業していますが、これまでのところ正常に動作していますが、突然クラッシュし始め、次のエラーが発生し続けました。

2012-08-13 08:39:50.000 OGLGame [36085:10a03]-[ NSCFString setFrame:]:認識されないセレクターがインスタンス0x7368300に送信されました2012-08-13 08:39:50.031 OGLGame [36085:10a03](0 CoreFoundation
0x0166203e __exceptionPreprocess + 206 1 libobjc.A.dylib
0x01c7fcd6 objc_exception_throw + 44 2 CoreFoundation
0x01663cbd-[NSObject doesNotRecognizeSelector:] + 253 3
CoreFoundation 0x015c8ed0 __ forwarding
+ 432 4 CoreFoundation 0x015c8cb2
_CF_forwarding_prep [EAGLView initGame] + 299 7 OGLGame
0x00003217-[EAGLView initWithCoder:] + 1047 8 UIKit
0x00a48135-[UIClassSwapper initWithCoder:] + 243 9 UIKit
0x00b47c6e UINibDecoderDecodeObjectForValue + 2276 10 UIKit 0x00b47383-[UINibDecoder decodeObjectForKey
:] + 117 0x00b47c6e UINibDecoderDecodeObjectForValue + 2276 13 UIKit 0x00b4767b UINibDecoderDecodeObjectForValue + 753 14 UIKit 0x00b47383-[UINibDecoder decodeObjectForKey:] + 117 15 UIKit 0x00a47105-[UINib instanceiateWithOwner :options] + 157 17 UIKit






0x00825ce1-[UIApplication _loadMainNibFileNamed:bundle:] + 58 18 UIKit 0x00825ff8-[UIApplication _loadMainInterfaceFile] + 225 19 UIKit 0x0082517f-[UIApplication _runWithURL:payload:launchOrientation:statusBarStyle:statusBarHidden:] + 279 20 UIKit ] + 1027 21 UIKit 0x00834c38-[UIApplication sendEvent:] + 68 22 UIKit
0x00828634 _UIApplicationHandleEvent + 8196 23 GraphicsServices
0x03af7ef5 PurpleEventCallback + 1274 24 CoreFoundation
0x01636195 CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION + 53 25 CoreFoundation 0x0159aff2 __CFRunLoopDoSource1 + 146 26 CoreFoundation 0x015998da __CFRunLoopRun + 2218 27 CoreFoundation 0x01598d84
CFRunLoopRunSpecific + 212 28 CoreFoundation
0x01598c9b CFRunLoopRunInMode + 123 29 UIKit0x00824c65-
[ アプリケーション 0x00002945開始+5333 ??? 0x00000001 0x0 + 1)



エラーをスローしていると私が信じている関数は次のとおりです。

-(void)setupScore {

scoreLabel = [NSString stringWithFormat:@"foo"];
scoreLabel.frame = CGRectMake(262, 250, 100, 40);
[scoreLabel setText: scoreString];

//normally you'll want a transparent background for your label
scoreLabel.backgroundColor = [UIColor clearColor]; 

//you can use non-standard fonts
[scoreLabel setFont:[UIFont fontWithName:@"TimesNewRoman" size: 1.0f]];

//change the label's text color
scoreLabel.textColor = [UIColor whiteColor];

//you can even create a drop shadow on your label text
/*myLabel.layer.shadowOpacity = 0.6;   
 myLabel.layer.shadowRadius = 0.0;
 myLabel.layer.shadowColor = [UIColor blackColor].CGColor;
 myLabel.layer.shadowOffset = CGSizeMake(1.0, 1.0);*/

//add it to your view
scoreLabel.transform = CGAffineTransformMakeRotation(89.53);
[self addSubview:scoreLabel];  }

-(void)resetScore{スコア=0; scoreLabel.textColor = [UIColor blackColor]; [scoreLabelリリース]; }

-(void)drawScore {
[scoreLabel setText:scoreString]; }

この奇妙なクラッシュを修正する方法を知っている人はいますか?

さらにコードが必要な場合はお知らせください、ありがとうございます!

4

3 に答える 3

1

投稿したスタックに基づいて[EAGLView setupScore]、変数を何か(おそらくNSString)に割り当てる場所が内部にあり、そのメソッドallocの戻り値を同じ変数に割り当てていない可能性があります。init

// this is WRONG!!
NSString *aString = [NSString alloc];
[aString initWithFormat:@"foo"];

// this is correct
NSString *aString = [[NSString alloc] initWithFormat:@"foo"];

// even better
NSString *aString = [NSString stringWithFormat:@"foo"];
// (class methods named in this manner (start with name of class) 
// take care of alloc and init for you)

その理由は、init メソッドは alloc が返すものとはまったく異なるポインターを返すことが許可されており、この新しいポインターは有効ですが、古いポインターは有効ではないためです。常にalloc/init 呼び出しをこの方法でネストしてください。

編集

別の回答のコメントに投稿した情報に基づいて、[scoreLabel setText: scoreString];内部の呼び出し-(void) setupScoreが を介して不適切に保持された NSString オブジェクトを使用しているようscoreStringです。

私の推測では、その文字列の @property が弱いと宣言されているか、どこでも適切に初期化していません。

編集 2

scoreLabel 変数と scoreString 変数の扱いが不適切です。ある場所では、scoreLabel プロパティを NSString に設定しています。あなたはおそらく次のことをするつもりです:

scoreString = [NSString stringWithFormat:@"foo"];

次に、それが存在すると想定していますがscoreLabel、他の方法の1つで明示的に解放します。これは、適切に存在するかどうかをここで確認し、必要に応じて新しいものを作成する必要があることを意味します。

于 2012-08-10T21:23:58.820 に答える
0

コードが無効なメモリにアクセスしている可能性があります。これは、オブジェクトの割り当てが解除され、後で使用されるときに頻繁に発生します。ゾンビ検出をオンにして、これらのケースを検出できます。

于 2012-08-10T21:46:03.150 に答える
-1

スタックトレースは、初期化中にEAGLViewメソッドを呼び出す独自のビューを使用していることを示しています。setupScoreここの340行目でクラッシュが発生します。

このメソッドはどのように見えますか?

于 2012-08-11T01:20:33.133 に答える