数组中的值会自行更改

时间:2012-11-16 22:33:48

标签: objective-c arrays

这可能是一个完全没有问题的问题,但我似乎无法自己解决这个问题。我在这里搜索并谷歌,但没有运气。

我有一个名字的课程,例如' logme'。我在.h文件中实现了一个float * floaters,使一个属性在.m文件中合成它。 .m文件method1和method2中的两个方法。当我从viewcontroller执行method1时,它使floaters变量为具有某些值的数组。我NS他们检查他们是否是,他们是。之后我执行method2,只有NSLogs相同的数组,但现在数组中的值完全不同。

logme.h

@interface Logme : NSObject {
    float *floaters;
}
-(void)method1;
-(void)method2;

logme.m

@implementation Logme
-(void)method1 {
    floaters = (float[8]) {
        1.0f, 2.0f,
        3.0f, 4.0f,
        6.0f, 5.0f,
        7.0f, 8.0f,
    };
    for (int i = 0; i < 8; i++) {
        NSLog(@"%f", floaters[i]);
    }
}
-(void)method2 {
    for (int i = 0; i < 8; i++) {
        NSLog(@"%f", floaters[i]);
    }
}
@end

从viewcontroller调用方法:

logme = [Logme alloc];
[logme method1];
[logme method2];

结果:

NSLog from method1:
1.000000
2.000000
3.000000
4.000000
6.000000
5.000000
7.000000
8.000000

NSLog from method2:
0.000000
-1.998885
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
  • 对不起。我正在与这个4空间系统作战。它不会让我添加.m文件代码。最后得到了它:))

2 个答案:

答案 0 :(得分:2)

您正在为堆栈中的内存块分配指针,这意味着当您从mrthod1退出时将释放内存。在method1之后打印的值是临时的,也可能发生内存不存在触及,但通常堆栈在每次方法调用时都会发生变化,这就是你的情况。

选择1

您使用浮动数据作为数组,因此声明它是一个数组并且它将拥有它自己的存储:

@interface Logme : NSObject {
float floaters[8];
}

-(void)method1 {
    for(int i=0; i<8;i++)
        floaters[i]=i+1;
for (int i = 0; i < 8; i++) {
    NSLog(@"%f", floaters[i]);
}

选择2

让浮子成为一个指针,但是为浮子分配内存:

-(void)method1 {
floaters=(float*)malloc(8*sizeof(float));
for(int i=0; i<8; i++)
    floaters[i]=i+1;
for (int i = 0; i < 8; i++) {
    NSLog(@"%f", floaters[i]);
}

不要忘记在你不再需要时释放记忆。

答案 1 :(得分:0)

@HotLicks在评论中给出了直接答案。我以为我会给出一些解释。

当你在方法中有这样的东西时:

- (void)someMethod {
    float *numbers = (float[8]) {
        1.0f, 2.0f,
        3.0f, 4.0f,
        6.0f, 5.0f,
        7.0f, 8.0f,
    };
}  // <-- end of scope for these values

将值的内存放入称为堆栈的特殊内存区域。只要值在范围内,此内存就会保留在原位。换句话说,当达到代码块的结束大括号时,堆栈及其内存就会消失。

在您的情况下,您将此堆栈内存分配给实例变量。因此,当到达块的末尾并且堆栈值消失时,实例变量将指向相同的内存位置。但价值观不再存在。该内存空间可能已被重用于其他内容。

这就是第二种方法打印出不同值的原因。您正尝试从同一内存中访问8个浮点值,但内存已被重用于其他内容。

有一些可能的解决方案。您可以使用malloc为数组分配内存并将值复制到该内存空间(稍后使用free释放内存)。或者您可以使用NSArrayNSMutableArray