NSInteger增加了荒谬的值

时间:2014-03-21 00:59:07

标签: objective-c nsinteger

我有以下代码,它增加了一个新变量的现有值:

-(NSString *)increaseId:(NSInteger *)config_id{

   NSLog(@"%d",config_id);//Show 0
   NSInteger *varfg = 0;//Init
   varfg = config_id +1;//In logic here the compiler do 0 + 1 = 1
   NSLog(@"%d",varfg);// Show 8 ??

   return varfg;
}

如果变量config_id得到值' 0',当我增加+ 1时,值为8!我想知道为什么会发生这种情况,我该如何解决这个问题?

2 个答案:

答案 0 :(得分:2)

- (NSString *)increaseId:(NSInteger)config_id
{

   NSLog(@"%d",config_id);
   NSInteger varfg = config_id + 1;
   NSLog(@"%d",varfg);// Show 8 ??

   return [NSString stringWithFormat:@"%d", varfg];
}

指向整数的指针在原文中没有意义(可能在某些情况下有意义,但从你的问题中可以清楚地知道这不是其中之一)。因此,使用一个普通的NSInteger,它不是一个对象,只是一种声明一个原始整数的方法。


出现值“8”的原因是称为指针算法的现象的副作用。在varfg = config_id +1;行中发生的事情是你在指针中“添加一个”到一个整数。该指针值从位置0开始(因为你在那里设置),但64位机器上的NSInteger的大小是64位,或8个字节。添加将指针递增一个“NSInteger大小的内存量”,从而使其值为8.

答案 1 :(得分:0)

您正在传递一个指向整数的指针,因此您必须取消引用它...

NSLog(@"%d", *config_id);

如果你真的想要一个整数,你应该有这个......

-(NSString *)increaseId:(NSInteger)config_id;

此外,您的签名表明您正在返回NSString*,但您的代码中没有这样做。

所以,如果你只想传递整数......

-(NSString *)increaseId:(NSInteger)config_id{
    NSLog(@"%d", config_id);//Show 0
    NSInteger varfg = 0;//Init
    varfg = config_id +1;//In logic here the compiler do 0 + 1 = 1
    NSLog(@"%d",varfg);// Show 8 ??

    return [NSString stringWithFormat:@"%d", varfg];
}