已经花了几个小时在这上面,我确信我错过了一些完全明显的东西。我是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”?
答案 0 :(得分:3)
问题的根源是int
和NSInteger
可以是不同的尺寸。因此,您将指向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位大小。