1

ローカルを明示的CGFloatに0に初期化しないと、変数がガベージを保持する場合がありました。

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

[self foo];
[self foo];

出力:

float:0
float:70

したがって、実際には両方の時間で0を出力する必要がありますが、floatを明示的に0に初期化していないため、2回目にはガベージが含まれていました。私の質問は、これはオブジェクトにも当てはまりますか?これら2つのオプションの間にローカル変数の違いはありますか?

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、2回目に呼び出したときに、aFloat変数が同じ場所にマップされました。

より具体的な説明については、これまでで最高の回答の1つを強くお勧めします。

于 2012-08-06T07:29:39.030 に答える
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'

このテストプロジェクトでは、ARCではなくMRRを使用していることに注意してください。

于 2012-08-06T05:49:55.580 に答える