我知道在目标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