在头文件中声明时是否分配和初始化对象,还是需要在实现中分配和初始化对象?
其中哪一个是正确的?
.h
@interface myViewController : UIViewController
@property (nonatomic, strong) UIImageView *bgImageView;
@end
.m
- (void)viewDidLoad
{
if (!self.bgImageView) {
NSString *fullpath = [[[NSBundle mainBundle] bundlePath] stringByAppendingString:@"/Background.png"];
self.bgImageView.image = [UIImage imageWithContentsOfFile:fullpath];
[self.view addSubview:self.bgImageView ];
[self.view sendSubviewToBack:self.bgImageView ];
}
或
.h
@interface myViewController : UIViewController
@property (nonatomic, strong) UIImageView *bgImageView;
@end
.m
- (void)viewDidLoad
{
if (!self.bgImageView) {
NSString *fullpath = [[[NSBundle mainBundle] bundlePath] stringByAppendingString:@"/Background.png"];
self.bgImageView = [[UIImageView alloc] initWithImage:[UIImage imageWithContentsOfFile:fullpath]];
[self.view addSubview:self.bgImageView ];
[self.view sendSubviewToBack:self.bgImageView ];
}
答案 0 :(得分:2)
在Objective-C中将对象属性显式设置为nil
,以避免其他语言可能具有的未初始化对象问题。
非对象属性设置为零版本(即CGFloat
为0.000000,NSRange
为{0,0},BOOL
为否)。
因此,您的第二个代码是正确的,但是如果您在self.bgImageView
之前的任何时间分配并初始化了self.bgImageView.image = ...
,那么您的第一个代码就可以正常运行(例如,在您的init
方法中查看控制器或loadView
或甚至self.bgImageView.image
以上的行。)
答案 1 :(得分:1)
将alloc和init放在.m文件中,如果其他VC需要访问该对象,则只将@property放在.h中,否则只需将它放在.m文件中。
测试你自己的代码,最好的学习方法