int和NSInteger的奇怪问题

use*_*251 5 macos cocoa objective-c nsinteger

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

这是我的代码:

.h 文件:

@property (assign) NSInteger *freeTrialCounter;
Run Code Online (Sandbox Code Playgroud)

.m 文件

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

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

int b = *self.freeTrialCounter;
NSLog(@"B: %d", b);
Run Code Online (Sandbox Code Playgroud)

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

我在这里错过了什么?为什么"B"不等于"2"?

Cal*_*leb 3

问题的根源在于intNSInteger可以是不同的大小。因此,您将指向 an 的指针分配NSInteger给 type 的属性NSInteger*,这是可以的(但不寻常)。但是,您将该值取消引用为 an 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);
Run Code Online (Sandbox Code Playgroud)

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