如果在.h文件中声明,则需要分配和初始化对象

时间:2013-07-28 07:13:36

标签: ios objective-c

在头文件中声明时是否分配和初始化对象,还是需要在实现中分配和初始化对象?

其中哪一个是正确的?

.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 ];

}

2 个答案:

答案 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文件中。

测试你自己的代码,最好的学习方法