0

または、代わりに、このUILabelの使用によりNSMutableDictionary NSInvalidArgumentExceptionがどのように生成される可能性がありますか?

これは非ARCiOSアプリです。showLabel(下記)を実行すると、まれに[__NSDictionaryM setObject:forKey:]がエラーをスローするのを参照してください:NSInvalidArgumentException * setObjectForKey:key canbenil。

@property (nonatomic, retain) UILabel *myLabel;
@synthesize myLabel = _myLabel;

- (void)showLabel{

if (self.myLabel) {
    return;
}

self.myLabel                        = [[[UILabel alloc] initWithFrame:self.tableView.frame] autorelease];
self.myLabel.textColor              = [UIColor whiteColor];
self.myLabel.shadowColor            = [UIColor blackColor];
self.myLabel.shadowOffset           = CGSizeMake(0, 1);
self.myLabel.textAlignment          = UITextAlignmentCenter;
self.myLabel.text                   = @"blah";
self.myLabel.userInteractionEnabled = YES;
[self.myLabel addGestureRecognizer:[[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(labelTapped:)] autorelease]];
[self.view addSubview:self.myLabel];
[self.view bringSubviewToFront:self.myLabel];

}

- (void)hideLabel {
if (!self.myLabel) {
    return;
}

[self.myLabel removeFromSuperview];
self.myLabel = nil;

}

[__NSDictionaryM setObject:forKey:]を中断すると、UILabelのsetTextColor、setShadow、setShadowOffset、およびsetTextAlignmentメソッド内で呼び出されます。送信する値はいずれもnilになることはありませんが、このディクショナリの使用法はラベルの内部にあるため、自動解放プールを引き起こす他のイベントが原因で、自動解放を送信した後にラベルへの参照が失われるのではないかと思います。私がまだメソッドにいる間にドレインし(アプリには複数の外部ライブラリが含まれています)、そのために内部辞書の使用でエラーが発生することがあります。

この場合、NSMutableDictionaryのNSInvalidArgumentExceptionエラーを説明できる可能性がありますか?

完全なスタックトレースは次のとおりです。

NSInvalidArgumentException *** setObjectForKey: key cannot be nil

1 libobjc.A.dylib 0x3678c963 objc_exception_throw + 31
2 CoreFoundation 0x378625ef -[__NSDictionaryM setObject:forKey:] + 143
3 MyApp 0x000effab -[TableViewController showLabel] (MainTableViewController.m:222)
4 CoreFoundation 0x37851349 _CFXNotificationPost + 1421
5 Foundation 0x37b2d38f -[NSNotificationCenter postNotificationName:object:userInfo:] + 71
6 MyApp 0x000d9141 -[Event setDictionary:] (Event.m:123)
4

1 に答える 1

1

自動リリースとは何の関係もないと言っても過言ではありません。プロパティには保持があり、変数を格納するときにプロパティを正しく使用しているため、保持カウンターは+1(割り当て)+1(プロパティセッター保持)になり、最終的には-1(自動解放)になります。

あなたの問題はおそらく他の場所にありますが、コードを追加しないと理解できません。ごめんなさい!

編集:あなたが超安全にプレイしたい場合(そして私は実際にこれをお勧めします)、あなたは次のようにすることができます:

self.myLabel = [[UILabel alloc] initWithFrame:self.tableView.frame];
// configure
[self.myLabel release];

同じことがジェスチャーレコグナイザーにも当てはまります

それを試して、まだクラッシュするかどうかを確認してください

于 2012-12-26T19:54:41.437 に答える