2012-03-19 63 views
0

我知道Objective C中的實例變量總是被初始化爲0(或者nil,NULL或false,這取決於確切的數據類型)''。 stackoverflow question爲什麼實例變量(顯然)沒有被init設置爲nil?

在下面的單元測試2,爲什麼在Fruit橙色實例未設置爲nil實例變量_willBeRipeBy?它在STAssertNil([orange willBeRipeBy],nil)失敗。

test2通行證,如果我創建init方法explicitatly設置_willBeRipeBy爲nil或者如果我重命名test1到TEST3改變執行順序。

創建appletest1似乎影響了內存orange用途,但爲什麼水果init不進行重置實例變量爲零。

我是新來的目標C,謝謝。

(使用的Xcode 4.3,iOS5.0帶有自動引用計數上)

@interface Fruit : NSObject 
- (NSDate *)getWillBeRipeBy; 
- (void)setWillBeRipeBy:(NSDate *)ripeBy; 
@end 

@implementation Fruit 

NSDate *_willBeRipeBy; 

- (NSDate *)getWillBeRipeBy{ 
    return _willBeRipeBy; 
} 
- (void)setWillBeRipeBy:(NSDate *)ripeBy{ 
    _willBeRipeBy = ripeBy; 
} 
@end 

@implementation TestIvarInitialisationTests 

- (void)test1 
{ 
    Fruit *apple = [[Fruit alloc] init]; 
    STAssertNil([apple getWillBeRipeBy],nil); 
    NSDate * now = [NSDate date]; 
    [apple setWillBeRipeBy:now]; 
    STAssertEqualObjects([apple getWillBeRipeBy], now,nil); 
} 

- (void)test2 
{ 
    Fruit *orange = [[Fruit alloc] init]; 
    STAssertNil([orange getWillBeRipeBy],nil); 
} 
@end 
+1

不要用'get'前綴方法,順便說一句。只要將它稱爲'willBeRipeBy'或'ripeDate'或'willBeRipeDate'。 – bbum 2012-03-19 16:24:32

回答

4

您必須聲明變量的頭文件中的實例變量或{} -brackets的@implementation指令之後。

你的實現是一個全局變量

btw。你不應該命名像「get ...」這樣的方法 - 這是違反可可命名約定的。當你想設置一個非對象類型時,你只能使用「get ..」,例如:CGRect rect; [userInfoDictionary getValue:&rect forKey:@"bla"]
你可以使用屬性(@property(strong) NSString *property@synthesize property)自動實現實例變量以及getter和setter方法

+0

謝謝你扔我。 – ken 2012-03-19 15:53:32

2

由於執行塊內聲明變量不是實例變量,它們是類的實例之間共享的全局變量。顯然全局變量不保證被初始化爲一個合理的值。

你的水果類應該是這樣的:

@interface Fruit : NSObject 
@property(strong) NSDate *willBeRipeBy; 
@end 

@implementation Fruit 
@synthesize willBeRipeBy; 
@end 
相關問題