1

有一种情况,如果不将局部变量显式初始化CGFloat为 0,则会导致变量持有垃圾:

-(void)foo
{
   CGFloat aFloat;
   NSLog(@"float:%f", aFloat);
   aFloat = 70;
}

[self foo];
[self foo];

输出:

float:0
float:70

所以它确实应该两次都打印 0,但由于我没有明确地将浮点数初始化为 0,所以它第二次包含垃圾。我的问题是,这也适用于对象吗?这两个选项之间的局部变量是否有区别:

1. NSObject *object;
2. NSObject *object = nil;
4

3 回答 3

3

如果指针是 ivar,则指针最初为 nil。(如果你在类的@interface 部分声明了它,它就是一个ivar。)如果指针是一个局部变量(你在一个方法中声明它),它将包含垃圾。最好的做法是总是立即分配一些东西。

更新:正如 omz 在评论中指出的那样,如果您使用的是 ARC,那么如果它们是局部变量,您的指针也会被取消。

于 2012-08-06T05:12:00.057 回答
2

它第二次包含垃圾

实际上它不包含垃圾。它包含与之前写入内存中该位置的相同值。碰巧堆栈没有机会被任何新值覆盖,所以当您foo第二次调用时,aFloat变量被映射到同一位置。

对于更具体的描述,我强烈推荐有史以来最好的答案之一

于 2012-08-06T07:29:39.030 回答
1

是的,同样适用;对象指针是一个变量,就像浮点数一样:

测试.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。

于 2012-08-06T05:49:55.580 回答