2013-03-19 15 views
5

Facendo qualche debug Ho stampato la descrizione di una variabile NSDictionary che conferisce a questo:(NSDictionary *) labelAttrs = 0x00000001

(NSDictionary *) labelAttrs = 0x00000001 

Qualcuno può chiarire il motivo per cui questo è 1?

Capisco nil o un puntatore all'oggetto ma perché 1?

UPDATE

Il codice:

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

Si blocca quando viene eseguito su iOS5, ma non iOS6 ma questo:

Are the new object literals backwards compatible with iOS 5?

sembra dire che è possibile utilizzare i nuovi letterali con iOS5 (a patto che si costruisca contro iOS6 e si usi Xcode> = 4.5 e si compili con l'ultimo LLVM - ad es. veda lo screen grab). E, secondo Apple, dovrei essere OK per usarli: https://developer.apple.com/library/ios/#releasenotes/ObjectiveC/ObjCAvailabilityIndex/index.html

enter image description here

Ecco come appare in Xcode prima:

enter image description here

Poi, quando ho scavalcare:

enter image description here

Nota: questo mi dà lo stesso c rash:

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

La rimozione di questa (e delle seguenti 2 righe di codice) indica che l'applicazione viene eseguita senza arrestarsi in modo anomalo. Ma ovviamente nessuna stringa attribuita.

AGGIORNAMENTO: risolto. Le stringhe attribuite non sono disponibili su iOS5 (almeno per UILabel): Is NSAttributedString available before iOS 6?

+0

Questo è l'indirizzo di memoria –

+2

Pubblica il codice che porta a questo valore. – rmaddy

+0

È piuttosto strano, di solito gli indirizzi di memoria più bassi sono riservati al sistema operativo. –

risposta

3

Il problema è che NSAttributedString UIKit additions non è disponibile fino a iOS 6. Ciò significa che le costanti NSForegroundColorAttributeName e altri non sono definite. Quindi la creazione del dizionario esplode cercando di farvi riferimento.

(Il modo per eseguire il debug di questo - a corto di controllare il riferimento per la versione sbagliata iOS (;)) - è quello di suddividere l'istruzione:

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]; 

poi vedere che cosa non riesce. In questo caso probabilmente avresti avuto un fallimento nell'assegnazione di labelAttrs1.Se si fosse in NSLog, value1 e key1 avresti ricevuto un errore su key1.)

0

0x00000001 indica un indirizzo di memoria non valido. Quale versione di Xcode stai usando? Potrebbe essere necessario passare da lldb a gdb

0

ho visto 0x00000001 in lldb quando im passo-passo attraverso il codice come questo:

labelAttrs = [self someMethod]; 

Se si stampa labelAttrs, prima di aver valutato la -someMethod, allora sarà assegnato a 0x00000001.