为什么实例变量(显然)没有被init设置为nil?

时间:2012-03-19 15:25:28

标签: objective-c initialization instance-variables

据我所知,在Objective C中,实例变量总是被初始化为0(或者nil,NULL或false,具体取决于确切的数据类型)'。 stackoverflow question

在下面的单元test2中,为什么_willBeRipeBy的橙色实例中的实例变量Fruit未设置为nil?它在STAssertNil([orange willBeRipeBy],nil)处失败。

如果我创建test2方法以明确地将init设置为nil,或者我将_willBeRipeBy重命名为test3以更改执行顺序,则

test1会通过。

apple中创建test1似乎影响了orange使用的内存,但为什么Fruits init没有将实例变量重置为nil。

我是目标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

2 个答案:

答案 0 :(得分:4)

您必须将变量声明为头文件中的实例变量,或{} - @implementation指令后的括号。

您的实施是一个全局变量

顺便说一句。你不应该命名像“get ...”这样的方法 - 这是针对可可命名约定的。当你想设置一个大小未知的非对象类型时,你应该只使用“get ..”,例如:CGRect rect; [userInfoDictionary getValue:&rect forKey:@"bla"]
您可以使用属性(@property(strong) NSString *property@synthesize property)自动实现实例变量以及getter和setter方法

答案 1 :(得分:2)

因为在实现块内声明的变量不是实例变量,所以它们是类实例之间共享的全局变量。显然全局变量不能保证初始化为合理的值。

你的Fruit课程应如下所示:

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

@implementation Fruit
@synthesize willBeRipeBy;
@end