有一种情况是,没有明确地将本地CGFloat
初始化为0会导致变量持有垃圾:
-(void)foo
{
CGFloat aFloat;
NSLog(@"float:%f", aFloat);
aFloat = 70;
}
[self foo];
[self foo];
输出:
float:0
float:70
所以它确实应该两次打印0,但由于我没有将float显式初始化为0,所以它第二次包含垃圾。我的问题是,这也适用于对象吗?这两个选项之间的局部变量是否存在差异:
1. NSObject *object;
2. NSObject *object = nil;
答案 0 :(得分:3)
如果指针是ivar,则指针最初为零。 (如果你在类的@interface部分声明它,那就是一个ivar。)如果指针是一个局部变量(你在一个方法中声明它),它将包含垃圾。最好始终立即分配一些东西。
更新正如omz的评论中指出的那样,如果你使用ARC,如果你的指针是局部变量,你的指针也会被填充。
答案 1 :(得分:2)
它第二次包含垃圾
实际上它没有垃圾。它包含先前在内存中写入该位置的相同值。刚发生堆栈没有机会被任何新值覆盖,所以第二次调用foo
时aFloat
变量被映射到同一位置。
有关更具体的说明,我强烈推荐其中一个best answers of all time。
答案 2 :(得分:1)
同样适用;对象指针是一个变量,就像float:
test.m:
#include <Foundation/Foundation.h>
@interface Foo : NSObject
{
NSString *ivarString;
}
- (void)foo;
- (void)test;
@end
@implementation Foo
- (void)foo
{
NSString *stackString;
NSLog(@"stackString='%@', ivarString='%@'", stackString, ivarString);
stackString = @"Hello";
ivarString = @"World";
}
- (void)test
{
[self foo];
[self foo];
}
@end
int main(int argc, const char **argv)
{
@autoreleasepool
{
Foo *foo = [[[Foo alloc] init] autorelease];
[foo test];
}
return 0;
}
输出:
2012-08-06 06:52:36.123 test[15293:403] stackString='(null)', ivarString='(null)'
2012-08-06 06:52:36.126 test[15293:403] stackString='Hello', ivarString='World'
请注意,此测试项目使用MRR,而非ARC。