Objective C分配和init?

时间:2013-03-05 09:14:00

标签: objective-c

当我玩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;
}

当我在main中使用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]   测试字符串

当使用第二个版本时(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] TEST STRING

问题是如果[TestClass alloc]进行任何初始化操作(正确返回字符串且值为零)...值得一提的是,如果删除{{1}从TestClass.m实现具有-(id)init:且没有它的版本的输出完全相同...是否有任何默认初始化?

3 个答案:

答案 0 :(得分:2)

alloc会将内存区域清零。更多细节可以在What happens when alloc or allocWithZone is called?

找到

答案 1 :(得分:1)

alloc没有正确初始化对象,因此必须始终使用。

float没有正确初始化(0.000 != 100.34),字符串是调用返回字符串文字的方法的结果,而不是实例变量。

答案 2 :(得分:1)

  

问题是,如果[TestClass alloc]进行任何初始化工作(String正确返回,值为零)...值得一提的是,如果我从TestClass.m中删除 - (id)init:实现,具有init和没有它的版本的输出完全相同...是否有任何默认初始化?

alloc不会初始化任何成员,所以如果你只调用alloc,那么someFloat将不会被初始化(默认值将为0.0)。如果从类实现中保留alloc方法,则会发生同样的情况:someFloat将不会被初始化,并且默认值为0.0。

但是调用alloc而不是init有许多缺点:所有子类初始化器都不会被调用,因此你将无法使用某些NSObject的属性,你不应该只调用alloc。 alloc-init总是按惯例使用。