int和NSInteger的奇怪问题

时间:2014-05-16 17:56:31

标签: objective-c macos cocoa nsinteger

已经花了几个小时在这上面,我确信我错过了一些完全明显的东西。我是cocoa / objective c的新手,并且用指针/物体生锈,因此非常感谢某人(亲切地!)指出我出错的地方。

这是我的代码:

.h档案:

@property (assign) NSInteger *freeTrialCounter;

.m档案

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

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

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

这是输出: 免费试用计数器:2 B:1606411536

我在这里缺少什么?为什么“B”不等于“2”?

1 个答案:

答案 0 :(得分:3)

问题的根源是intNSInteger可以是不同的尺寸。因此,您将指向NSInteger的指针分配给类型为NSInteger*的属性,这是可以的(但不常见)。但是,您将该值取消引用为int,其大小不一样。

但是,我认为您可能也会对如何声明要保存NSInteger的属性感到困惑。 NSInteger只是一个简单的整数类型,而不是一个对象,因此不需要使用指针来引用它。这是真实的,因为您似乎声明了NSInteger您在堆栈上占用的地址,因此只要您执行赋值的方法结束,指针就会无效。

使用普通的NSInteger属性而不是尝试在这里使用指针会好得多。这样做:

@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);

请注意,我还将b的类型更改为NSInteger以匹配属性类型。由于它们的大小不一定相同,因此将两者混合(如您所见)会导致问题。同样,我已将格式说明符从%d更改为%ld,以匹配NSInteger的64位大小。