这可能是一个完全没有问题的问题,但我似乎无法自己解决这个问题。我在这里搜索并谷歌,但没有运气。
我有一个名字的课程,例如' 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
答案 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
释放内存)。或者您可以使用NSArray
或NSMutableArray
。