0

Objective-C で遊んでいたときの楽しみのために、サンプルの短いデモ プログラムを作成しました。

コードの一部:

// TestClass.h:    
@interface TestClass : NSObject {
        int someNumber;
        float someFloat;

    }
    @property int someNumber;
    @property float someFloat;

    // Returns String containing some instance values:
    -(NSString *)getNiceString;
    // Returns always the same string:
    -(NSString *)getAnotherString;
    -(id)init;

    @end

--

//TestClass.m:
#import "TestClass.h"

@implementation TestClass

@synthesize someFloat;
@synthesize someNumber;

-(NSString*) getNiceString{

    return [NSString stringWithFormat:
            @"Float number: %f and the number is: %d", self.someFloat, self.someNumber];
}

-(NSString *) getAnotherString{
    return [NSString stringWithString:@"TEST STRING"];
} 

-(id)init{
    self = [super init];
    if(self){
        self.someFloat = 100.34;
        self.someNumber = 324;

        return self;
    }
    return nil;
}
@end

そしていくつかの主なもの:

#import <Foundation/Foundation.h>
#import "TestClass.h"


int main (int argc, const char * argv[])
{

    @autoreleasepool {

        TestClass* instance = [TestClass alloc];
        // Version 2: 
        // TestClass* instance = [[TestClass alloc]init];

        NSLog(@"%@", [instance getNiceString]);
        NSLog(@"%@", [instance getAnotherString]);
    }
    return 0;
}

メインで使用するTestClass* instance = [TestClass alloc];と、出力は次のようになります。

2013-03-05 09:56:34.767 ObjectiveTest[8367:903] 浮動小数点数: 0.000000 およびその数: 0 2013-03-05 09:56:34.770 ObjectiveTest[8367:903] テスト文字列

代わりに 2 番目のバージョンを使用する場合 ( TestClass* instance = [[TestClass alloc]init];):

2013-03-05 10:06:46.743 ObjectiveTest[8421:903] 浮動小数点数: 100.339996、その数: 324 2013-03-05 10:06:46.750 ObjectiveTest[8421:903] テスト文字列

問題は、初期化が行われるかどう[TestClass alloc]かです(文字列が適切に返され、値がゼロになる)... -(id)init:TestClass.m から実装を削除すると、それを含むバージョンinitと含まないバージョンの出力がまったく同じになることに注意してください.. . デフォルトの初期化はありますか?

4

3 に答える 3

2

alloc はメモリ領域をゼロにします。詳細はこちらalloc または allocWithZone が呼び出されるとどうなりますか?

于 2013-03-05T09:19:34.073 に答える
1

allocオブジェクトを正しく初期化しないため、常に使用する必要があります。

floatが正しく初期化されておらず(0.000 != 100.34)、文字列は、インスタンス変数ではなく、文字列リテラルを返すメソッドを呼び出した結果です。

于 2013-03-05T09:16:51.080 に答える
1

問題は、[TestClass alloc] が初期化を行うかどうかです (文字列が適切に返され、値がゼロである)... TestClass.m から -(id)init: 実装を削除すると、バージョンの出力が出力されることに注意してください。 init の有無はまったく同じです... デフォルトの初期化はありますか?

alloc はメンバーを初期化しないため、 alloc を呼び出すだけでは someFloat は初期化されません (デフォルト値は 0.0 になります)。alloc メソッドをクラス実装から遠ざけると、同じことが起こります: someFloat は初期化されず、デフォルト値は 0.0 になります。

ただし、init ではなく alloc だけを呼び出すと、多くの欠点があります。すべてのサブクラスの初期化子が呼び出されないため、NSObject の一部の属性を使用できなくなります。alloc だけを呼び出すべきではありません。alloc-init は慣例により常に使用されます。

于 2013-03-05T09:20:50.967 に答える