MyObject对象是否可能;包含垃圾?

时间:2012-08-06 05:06:58

标签: iphone objective-c ios

有一种情况是,没有明确地将本地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;

3 个答案:

答案 0 :(得分:3)

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

更新正如omz的评论中指出的那样,如果你使用ARC,如果你的指针是局部变量,你的指针也会被填充。

答案 1 :(得分:2)

  

它第二次包含垃圾

实际上它没有垃圾。它包含先前在内存中写入该位置的相同值。刚发生堆栈没有机会被任何新值覆盖,所以第二次调用fooaFloat变量被映射到同一位置。

有关更具体的说明,我强烈推荐其中一个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。