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



我知道在目标C中,实例变量总是初始化为0(或nil、NULL或false,具体取决于确切的数据类型)。stackoverflow问题

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

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

test1中创建apple似乎会影响orange使用的内存,但为什么Fruits 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

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

您的实现是一个全局变量

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

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

你的水果类应该是这样的:

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

最新更新