0

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

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

日志文件

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

日志文件

@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

从视图控制器调用方法:

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 文件代码。终于到这里了:)
4

2 回答 2

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

让 floaters 成为一个指针,但动态地为 floaters 分配内存:

-(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]);
}

并且不要忘记在不再需要时释放内存。

于 2012-11-16T23:09:01.627 回答
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)。或者您可以使用NSArrayor NSMutableArray

于 2012-11-16T23:05:22.203 回答