Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone MyObject对象是否可能;装垃圾?_Iphone_Objective C_Ios - Fatal编程技术网

Iphone MyObject对象是否可能;装垃圾?

Iphone MyObject对象是否可能;装垃圾?,iphone,objective-c,ios,Iphone,Objective C,Ios,有一种情况是,如果不显式地将本地CGFloat初始化为0,则会导致包含垃圾的变量: -(void)foo { CGFloat aFloat; NSLog(@"float:%f", aFloat); aFloat = 70; } [self foo]; [self foo]; 输出: float:0 float:70 2012-08-06 06:52:36.123 test[15293:403] stackString='(null)', ivarString='(null

有一种情况是,如果不显式地将本地CGFloat初始化为0,则会导致包含垃圾的变量:

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

[self foo];
[self foo];
输出:

float:0
float:70
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'
所以它实际上应该两次都打印0,但是因为我没有显式地将浮点初始化为0,所以第二次它包含垃圾。我的问题是,这是否也适用于对象?这两个选项之间的局部变量是否存在差异:

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

如果指针是ivar,则它最初为零。如果您在类的@interface部分声明了它,那么它就是一个ivar。如果指针是一个局部变量,您在方法中声明它,它将包含垃圾。最好的做法是总是立即分配任务


更新:正如omz在评论中指出的那样,如果您使用的是ARC,那么如果指针是局部变量,那么指针也将为零。

如果指针是ivar,那么指针最初为零。如果您在类的@interface部分声明了它,那么它就是一个ivar。如果指针是一个局部变量,您在方法中声明它,它将包含垃圾。最好的做法是总是立即分配任务


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

是,同样适用;对象指针是一个变量,与float类似:

测试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;
}

请注意,此测试项目使用MRR,而不是ARC。

是,同样适用;对象指针是一个变量,与float类似:

测试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;
}
请注意,此测试项目使用MRR,而不是ARC

它第二次装的是垃圾

其实里面没有垃圾。它包含以前写入内存中该位置的相同值。恰好堆栈没有机会被任何新值覆盖,所以当您第二次调用foo时,浮动变量被映射到同一位置

对于更具体的描述,我强烈推荐其中一种

它第二次装的是垃圾

其实里面没有垃圾。它包含以前写入内存中该位置的相同值。恰好堆栈没有机会被任何新值覆盖,所以当您第二次调用foo时,浮动变量被映射到同一位置


对于更具体的描述,我强烈推荐其中一个。

补充:如果使用ARC,所有对象都将初始化为nil,而不仅仅是ivar。这对ARC是如何工作的?如果它包含垃圾,它将尝试释放垃圾;NSLog@%@,str;将实际记录null而不是潜在崩溃。@感谢您指出这一点,我已将其添加到我的答案中。此外:如果使用ARC,则所有对象都将初始化为nil,而不仅仅是ivars。这对ARC是如何工作的?如果它包含垃圾,它将尝试释放垃圾;NSLog@%@,str;将实际记录为null,而不是可能崩溃。@感谢您指出这一点,我已将其添加到我的答案中。应该这样吗NSLog@float:%f,漂浮着;?应该是这样吗NSLog@float:%f,漂浮着;?