2012-04-04 7 views
0

Dies ist eine Frage, aber ich kann nicht für das Leben von mir herausfinden, warum meine MSMutableArray-Klassenvariable nicht festgelegt ist. Unten ist mein Code:Warum wird meine Objective-C-Klasseninstanzvariable nicht gesetzt?

@interface MyClass : NSObject { 
    NSMutableArray *imageArr; 
} 

@implementation MyClass 
-(id)init 
{ 
    self = [super init]; 
    if (self) { 
     imageArr = [[NSMutableArray alloc] init]; 
    } 
    return self; 
} 

- (void) checkImageArr { 
    NSLog(@"imageArr size::%@",[imageArr count]); 
} 

Wenn dieser Code ausgeführt wird, wird wie folgt auf das Protokoll: ist

imageArr size::(null) 

Warum nicht diese Variable gesetzt werden? Ich schaute auf die folgenden question und sehe nichts anderes zwischen meinem Code und der angenommenen Antwort.

Danke.

Antwort

1

Der% @ -Spezifikator erwartet, dass das Argument ein id (oder Zeiger auf ein Objekt) ist. -count gibt einen NSUInteger zurück, der kein Objekt ist. Da Ihr Array leer ist, ist die Anzahl gleich Null und daher wird das Argument als ein Nullobjekt interpretiert, das als (null) ausgegeben wird, wenn es mit dem Spezifizierer %@ verwendet wird.

Wenn das Argument nicht Null war, würde -description an es gesendet werden, um eine Zeichenfolge in der Protokollnachricht einzufügen. Wenn Sie also Ihrem Array ein Objekt hinzufügen, versucht NSLog, 1 als Objektzeiger zu interpretieren und -description dorthin zu senden. Dies verursacht eine EXC_BAD_ACCESS Ausnahme (versuchen Sie es!).

Sie benötigen einen Formatbezeichner, der das Argument als Zahl interpretiert. NSUinteger hat die folgende Definition

#if __LP64__ || TARGET_OS_EMBEDDED || TARGET_OS_IPHONE || TARGET_OS_WIN32 || NS_BUILD_32_LIKE_64 
typedef unsigned long NSUInteger; 
#else 
typedef unsigned int NSUInteger; 
#endif 

so ist es wahrscheinlich ein unsigned long. Aus Sicherheitsgründen, warf ich es immer sicher zu machen, so müssen Sie dies:

NSLog(@"imageArr size::%lu", (unsigned long)[imageArr count]); 
1

Die Methode count gibt einen NSUInteger zurück.

dieses Logformat Versuchen Sie stattdessen:

NSLog(@"imageArr size::%u",[imageArr count]); 
+0

Es ist eine gute Idee, einen eingegossenen zu setzen, weil NSUInteger garantiert keine 'unsigned int' – JeremyP

0
NSLog(@"imageArr size::%@",[imageArr count]); 

Sie% @ verwenden sollten, wenn Sie möchten, AFAIK "ein Objekt schreiben", ist es wie Schreib [Objektbeschreibung]. [BildArr zählen] ist ein Int, oder? Es ist kein Zeiger auf ein Objekt.

Sie sollten% i anstelle von% @ verwenden. Und die Größe ist 0.

Versuchen Sie NSLog (@ "imageArr size ::% @", imageArr); Wenn Sie eine Adresse schreiben möchten

+0

' NSUInteger' ist 'unsigned sein lang "auf dem iPhone, so"% i "ist falsch. – JeremyP

Verwandte Themen