据我所知,在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
答案 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