2013-03-05 127 views
0

我刚刚作出了一个样本简短的演示程序的乐趣,当我与Objective-C的比赛:ObjectiveC分配和init?

一些代码片段:

// 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年3月5日09:56:34.767 ObjectiveTest [8367:903]浮点数:0.000000 和数量为:0 2013年3月5日09:56:34.770 ObjectiveTest [8367:903] 测试字符串

当第二版本来代替(TestClass* instance = [[TestClass alloc]init];):

2013年3月5日10:06:46.743 ObjectiveTest [8421:903]浮点数: 100.339996并且编号为:324 2013-03-05 10:06:4 6.750 ObjectiveTest [8421:903]测试字符串

的问题是,如果使得[TestClass alloc]任何初始化的东西(字符串正常返回的和值是零)......值得一提的是,如果我删除-(id)init:从TestClass.m的实现init版本的输出,没有它是完全一样的......有没有任何默认的初始化?

回答

1

的问题是,如果[TestClass的页头]做任何初始化的东西(字符串正常返回的和值是零)......值得一提的是,如果我删除 - ( id)init:TestClass.m的实现init和没有它的版本的输出是完全一样的......有没有默认的初始化?

alloc不初始化任何成员,所以如果你只是调用alloc,那么someFloat不会被初始化(默认值为0.0)。如果你远离你的类实现的alloc方法,会发生同样的情况:someFloat不会被初始化,它的默认值为0.0。

但是只调用alloc而不是init有许多缺点:所有的子类初始化都不会被调用,因此你将不能使用某些NSObject的属性,你不应该调用alloc。约定始终使用alloc-init。

+0

谢谢你的回答; ) – 2013-03-05 09:31:09

1

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

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