2013-03-05 215 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),字符串是調用返回字符串文本而不是實例變量的方法的結果。