2014-05-16 12 views
5

Spędziłem kilka godzin na tym i jestem pewien, że brakuje mi czegoś całkowicie oczywistego. Jestem nowy w stosunku do kakao/obiektywu c i zardzewiały ze wskaźnikami/obiektami, a zatem bardzo doceniam kogoś (życzliwie!) Wskazując, gdzie idę źle.Dziwne problemy z int i NSInteger

Oto mój kod:

.h file:

@property (assign) NSInteger *freeTrialCounter; 

.m plik

NSInteger a = 2; 
self.freeTrialCounter = &(a); 

NSLog(@"Free Trial Counter: %d", *self.freeTrialCounter); 

int b = *self.freeTrialCounter; 
NSLog(@"B: %d", b); 

tu jest wyjście: Free Trial Licznik: 2B: 1606411536

Czego mi tu brakuje? Dlaczego "B" nie równa się "2"?

+1

Jaki jest sens tworzenia wskaźnika do 'int' jako własności? Tylko do celów eksperymentalnych, czy co? To nie jest coś, co wydaje się mieć jakąkolwiek popularną aplikację w świecie rzeczywistym. – dandan78

+1

Wypróbowałem twój kod, B zwraca 2 dla mnie. Jedynym możliwym problemem, o którym myślałem, jest to, że NSInteger jest w rzeczywistości długim i nie int. Oznacza to, że jest 64-bitowy, a nie 32-bitowy. Masz możliwą utratę danych podczas bezpośredniej konwersji z "b" – Yarneo

+0

dandan78 i Yameo: zobacz moją odpowiedź poniżej, aby pomóc Caleb ... postępował zgodnie z radą XCode "& (a)" i to doprowadziło mnie do złą. (Będąc nowicjuszem w tym języku, założyłem, że powinienem wysłuchać rady IDE ... teraz wiem lepiej!) Dziękuję za poświęcony czas i pomoc w tej sprawie. – user3643251

Odpowiedz

3

Źródłem problemu jest to, że int i NSInteger mogą mieć różne rozmiary. A więc przypisujesz wskaźnik do NSInteger do właściwości typu NSInteger*, co jest w porządku (ale nietypowe). Jednak wyłączysz tę wartość jako int, która nie ma tego samego rozmiaru.

Jednak myślę, że możesz także być zdezorientowany, w jaki sposób powinieneś zadeklarować własność posiadania NSInteger. NSInteger jest po prostu prostym typem całkowitym, a nie obiektem, więc nie trzeba używać wskaźnika, aby się do niego odwoływać. Jest to podwójnie prawdziwe, ponieważ wydaje się, że deklarujesz NSInteger, którego adres bierzesz na stos, więc wskaźnik będzie nieprawidłowy, gdy tylko metoda, w której wykonujesz zadanie, zakończy się.

Będziesz znacznie lepiej wykorzystywać zwykłą, starą właściwość NSInteger i nie próbujesz używać tu wskaźnika. Czy to w zamian:

@property (assign) NSInteger freeTrialCounter; 
//... 
NSInteger a = 2; 
self.freeTrialCounter = a; 

NSLog(@"Free Trial Counter: %ld", self.freeTrialCounter); 

NSInteger b = self.freeTrialCounter; 
NSLog(@"B: %ld", b); 

Zauważ, że ja również zmienić typ b do NSInteger dopasować typ właściwości. Ponieważ nie muszą być tej samej wielkości, mieszanie dwóch puszek (jak widzieliście) powoduje problemy. Podobnie zmieniłem specyfikator formatu z %d na %ld, aby pasował do 64-bitowego rozmiaru NSInteger.

+1

Jeśli chciał użyć wskaźników, z jakiegokolwiek powodu, to jest jego wybór. Naprawdę nie pomagasz mu znaleźć swojego problemu. Zamiast dawania alternatywy. – Yarneo

+0

@Yarneo Robisz dobry punkt, a ja będę edytować, aby rozwiązać rzeczywisty problem. OTOH, naprawdę nie ma sensu zapisywanie wskaźnika do liczby całkowitej jako własności, więc uważam, że PO po prostu popełnił błąd. * Musisz * używać wskaźników dla obiektów, ale 'NSInteger' nie jest typem obiektu. – Caleb

+1

Głosujcie ode mnie – Yarneo

Powiązane problemy