2012-03-19 79 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 
相关问题