2009-10-06 7 views
7

Kiedy próbuję wydrukować wartość całkowitą do konsoli pobranej z obiektu NSManagedObject, wyświetlana jest wartość 6 lub 8-cyfrowa (identyfikator obiektu?). Jeśli jednak użyję debuggera "Opis wydruku do konsoli", pojawi się jako wartość jednocyfrowa, jakiej oczekuję.Jak wydrukować wartość NSInteger z obiektu NSManagedObject za pomocą NSLog

Na przykład, przypisać 'sekwencji' obiekt do NSInteger a następnie wyświetlić za pomocą ciąg formatu NSLog:

MyProcess *myProcess = [array objectAtIndex:i]; 
NSInteger sequence = [[NSNumber numberWithInteger:(NSInteger)myProcess.sequence] intValue]; 
NSLog(@"sequence = %d",myProcess.sequence); 

wyjście konsoli:

2009-10-06 16:11:05.871 MyProcess[33185:20b] sequence = 565256 

Ale gdy próbuję „Print do konsoli "z debuggera, widzę wartość 1:

<MyStoryImage: 0x3f59a80> (entity: MyObject; id: 0x3f2d540 <x-coredata://FF21959A- 4B67-4587-A25F-66A7B8139DFA/MyProcess/p2> ; data: { 
sequence = 1; 
<x-coredata://FF21959A-4B67-4587-A25F-66A7B8139DFA/MyProcess/p1>; 
}) 

Twoja pomoc jest doceniana!

Odpowiedz

11

Co masz z NSManagedObject byłaby NSNumber, myślę. Łatwo drukować że:

MyProcess *myProcess = [array objectAtIndex:i]; 
NSLog(@"sequence = %@", myProcess.sequence); 

lub, jeśli naprawdę potrzebujemy NSInteger:

MyProcess *myProcess = [array objectAtIndex:i]; 
NSLog(@"sequence = %i", [myProcess.sequence integerValue]); 

myślę, że w tym kawałku kodu

NSInteger sequence = [[NSNumber numberWithInteger:(NSInteger)myProcess.sequence] intValue]; 

The (NSInteger) myProcess .sequence pobiera adres pamięci NSNumber. Nie możesz po prostu rzucić NSNumber w NSInteger.

+0

Dzięki! to (wraz z wyjaśnieniem Chucka% @ powyżej) zarówno mówi mi, co robiłem źle i jak to naprawić. – dfdumaresq

-1

NSInteger jest tylko int:

typedef int NSInteger; 

W pierwszym wierszu kodu:

NSInteger sequence = [[NSNumber numberWithInteger:(NSInteger)sequence] intValue]; 

Wszystko co robią jest przypisanie sekwencji do siebie, w rundzie o sposób. A ponieważ nie jest zainicjowany, może to być dowolna liczba losowa.

+0

NSInteger nie zawsze jest int. W aplikacjach 64-bitowych jest długi. –

+0

Niestety, oryginalny przykład był wadliwy. Wyjaśniłem (er), że sekwencja jest właściwością MyProcess. – dfdumaresq

0

W zależności od sposobu tworzenia aplikacji NSInteger może mieć 32 bity lub 64 bity. Jeżeli jest to wartość 64-bit, trzeba zrobić

NSLog(@"sequence = %qi", sequence) 

tak, że prawidłowo traktuje sequence jako wartości 64-bitowej. Pamiętaj jednak, że nie będzie to działać w przypadku aplikacji 32-bitowych; O ile mi wiadomo, nie ma jednego specyfikatora formatu, który będzie działał, aby wydrukować NSInteger zarówno w światach 32-bitowych, jak i 64-bitowych.

1

Brzmi jak myProcess.sequence jest NSNumber (object) raczej niż NSInteger (skalarne). To wyjaśniałoby, dlaczego pojawia się poprawnie w opisie obiektu, ale nie w przypadku, gdy wyraźnie spróbujesz wydrukować go jako liczbę całkowitą.

+0

Tak, jest to NSNumber (zgodnie z deklaracją CoreData), i przypuszczam, że to odpowiada na moje pytanie ...Byłem zdezorientowany, ponieważ właściwości NSString można drukować bez żadnego zamieszania, ale być może jest jakaś dodatkowa praca wykonana przez formatator znaków ("% @"). Dzięki! – dfdumaresq

+0

Specyfikacja '% @' wskazuje obiekt - dowolny obiekt. Możesz również wydrukować NSNumber w ten sposób. Na przykład 'NSLog (@"% @,% @,% @! ", [Numer NSNumberWithInt: 1], [numer NSNumberWithInt: 2], [numer NSNumberWithInt: 3])' będzie logować "1, 2, 3! ". Działa poprzez wywołanie metody "description" obiektu. Specyfikator '% d' jest dla ints. – Chuck

+0

Dzięki za to! – dfdumaresq

-1

Spróbuj tego:

NSLog(@"sequence = %li",(unsigned long)myProcess.sequence); 
+2

proszę poprawić swoją odpowiedź z wyjaśnieniem, szczególnie w porównaniu z innymi odpowiedziami, w których już podane – SBH

Powiązane problemy