私のアプリがカスタムでクラッシュするUIView
drawRect クラッシュはメモリ不足の状況でのみ発生します。drawRect - EXEC不正アクセスのクラッシュ
#0 0x31db6c9a in objc_msgSend()
#1 0x000051c8 in -[Timecard drawRect:] (self=<value temporarily unavailable, due to optimizations>, _cmd=<value temporarily unavailable, due to optimizations>, rect={origin = {x = 0, y = 0}, size = {width = 75, height = 108}}) at /xcode_prj/TimesheetKeeper/Classes/Timecard.m:72
#2 0x34caba04 in -[UIView(CALayerDelegate) drawLayer:inContext:]()
#3 0x37221fac in -[CALayer drawInContext:]()
#4 0x37221d2a in backing_callback()
#5 0x3722177c in CABackingStoreUpdate()
#6 0x3722117e in -[CALayer _display]()
#7 0x37220e8c in -[CALayer display]()
#8 0x3721570c in CALayerDisplayIfNeeded()
#9 0x372151cc in CA::Context::commit_transaction()
#10 0x37214fd6 in CA::Transaction::commit()
#11 0x37213906 in CA::Transaction::pop()
#12 0x37213884 in +[CATransaction commit]()
#13 0x34df7bd2 in _UIWindowUpdateVisibleContextOrder()
#14 0x34df7c66 in +[UIWindow _prepareWindowsForAppResume]()
#15 0x34df03e4 in -[UIApplication _handleApplicationResumeEvent:]()
...
:クラッシュする前に (私はバックグラウンドからフォアグラウンドに私のアプリを回して、いくつかのゲームやアプリケーションを実行した後)、それは、数回のdrawRect、そのうちの一つ、クラッシュ...
- (void)drawRect:(CGRect)rect {
NSLog(@" ## it is in drawRect");
//NSLog(@"timecardImage: %@ ",[timecardImage description]);
[timecardImage drawAtPoint:(CGPointMake(0.0f, 0.0f))];
}
クラッシュTBをトリガ私はViewControllerをのdidReceiveMemoryWarningコメント、
-(void)setupTimecard{
if (!self.timecard) {
self.timecard = [[Timecard alloc] init];
[self.timecard retain];
}
timecard.center = CGPointMake(self.view.center.x,10.0f);
[self.view insertSubview:timecard atIndex:2];
}
そして:self.timecard - 以下
は、どのように私のセットアップのUIViewです。 viewDidUnloadでは、私は "timecard"について何もしません。 Deallocでそれをリリースするだけです。
この問題は数日かかるため、私はまだ考えていません。 あなたが提供するアイデアは、私は試してみます。 ありがとうございます。
##完了! drawRect、timecardImageで##
-(id)init {
UIImage *image = [UIImage imageNamed:@"timecard3.png"] ;
timecardImage = image;
[timecardImage retain]; // #1 this is the key.
CGRect frame = CGRectMake(0, 0, image.size.width, image.size.height);
self = [self initWithFrame:frame];
return self;
}
自動解放画像にだけポインタである、drawAtPointの受信機です。 メモリ警告の問題で、オートレース画像が解放されました。私のタイムカードイメージもそうでした。 #1行を追加した後、保持するだけで、 EXC BAD ACCESSは起こりません。
ありがとうございます。
は、あなたの迅速な応答のためにどうもありがとうございます.-(無効)setupTimecard { \t \t場合(self.timecard!){\t \t \t \t self.timecard = [[タイムカードのalloc]のinit]; \t \t [self.timecard retain]; \t} \t \t timecard.center = CGPointMake(self.view.center.x、10.0f); \t [self.view insertSubview:timecard atIndex:2]; } // - 私はtimeCardをセットアップするときにこれを行います。しかし、それはまだクラッシュします。私はそれを保持した直後にそれを放つべきであることを意味しますか? – skingtree
コード 'self.timecard = [[Timecard alloc] init]; [self.timecard retain];おそらく三重保持されたオブジェクトになります。 '@ property'が'(retain) 'の場合、代入はそれを一度保持します。 '+ alloc'コールは+1保持カウントを返し、' -retain'を呼び出しています。オブジェクトを保持するには合計+1の保持回数が必要です。要するに、あなたの問題は他の場所です。 – jtbandes
@skingtree「タイムカード」の割り当てを解除する際に問題はないと思いますが、@ jtbandesのコメントを確認してください。私は、あなたが描くのに使っている 'timecardImage'について話していました。どのように管理していますか(メモリ単位)? –