5

いくつかのデバッグを行って、これを与える NSDictionary 変数の説明を出力しました:

(NSDictionary *) labelAttrs = 0x00000001

誰かがこれがなぜなのかを明確にできますか1?

nilまたはオブジェクトポインターを理解しますが、なぜ1ですか?

アップデート

コード:

NSDictionary *labelAttrs = @{NSForegroundColorAttributeName:[UIColor darkGrayColor]};

iOS6ではなくiOS5で実行するとクラッシュしますが、これは次のとおりです。

新しいオブジェクト リテラルは iOS 5 と下位互換性がありますか?

iOS5 で新しいリテラルを使用できると言っているようです (iOS6 に対してビルドし、Xcode >= 4.5 を使用し、最新の LLVM でコンパイルする限り - たとえば、画面グラブを参照してください)。そして、Apple によると、私はそれらを使用しても問題ないはずです: https://developer.apple.com/library/ios/#releasenotes/ObjectiveC/ObjCAvailabilityIndex/index.html

ここに画像の説明を入力

以前の Xcode での外観は次のとおりです。

ここに画像の説明を入力

次に、ステップオーバーすると:

ここに画像の説明を入力

注:これにより、同じクラッシュが発生します:

NSDictionary *labelAttrs = [NSDictionary dictionaryWithObjectsAndKeys:[UIColor darkGrayColor], NSForegroundColorAttributeName, [UIFont fontWithName:CUSTOMFONT size:size], NSFontAttributeName, [NSNumber numberWithInt:0], NSStrokeWidthAttributeName, nil];

これ (および次の 2 行のコード) を削除すると、アプリはクラッシュすることなく実行されます。しかし、明らかに属性付きの文字列はありません。

更新: 解決しました。属性付き文字列は iOS5 では使用できません (少なくとも UILabel の場合): NSAttributedString は iOS 6 より前に使用できますか?

4

3 に答える 3

3

問題は、NSAttributedString UIKit の追加機能が iOS 6 まで利用できないことです。これは、NSForegroundColorAttributeName などの定数が定義されていないことを意味します。したがって、辞書の作成は、これらを参照しようとして失敗します。

(これをデバッグする方法 -- 間違った iOS バージョン (;) のリファレンスをチェックすること以外) -- ステートメントを分割することです:

UIColor* value1 = [UIColor darkGrayColor];
NSString* key1 = NSForegroundColorAttributeName;
UIFont* value2 = [UIFont fontWithName:CUSTOMFONT size:size];
NString* key2 = NSFontAttributeName;
NSNumber* value3 = [NSNumber numberWithInt:0];
NSString* key3 = NSStrokeWidthAttributeName;

NSDictionary *labelAttrs0 = [NSDictionary dictionaryWithObjectsAndKeys:nil];
NSDictionary *labelAttrs1 = [NSDictionary dictionaryWithObjectsAndKeys:value1, key1, nil];
NSDictionary *labelAttrs2 = [NSDictionary dictionaryWithObjectsAndKeys:value2, key2, nil];
NSDictionary *labelAttrs3 = [NSDictionary dictionaryWithObjectsAndKeys:value3, key3, nil];

次に、何が失敗するかを確認します。この場合、labelAttrs1 の割り当てに失敗した可能性があります。次に NSLog value1 と key1 を使用すると、key1 でエラーが発生します。)

于 2013-03-19T18:33:02.270 に答える
0

次のようなコードをステップ実行すると、lldb で 0x00000001 が表示されます。

labelAttrs = [self someMethod];

-someMethod を評価する前に labelAttrs を出力すると、0x00000001 に割り当てられます。

于 2013-03-19T16:34:54.390 に答える
0

0x00000001 は、無効なメモリ アドレスを示します。Xcode のどのバージョンを使用していますか? lldb から gdb に切り替える必要がある場合があります

于 2013-03-19T16:26:12.493 に答える