2013-07-28 26 views
0

對象是在頭文件中聲明時分配並初始化的,還是需要在我的實現中分配並初始化對象?如果在.h文件中聲明,需要分配和初始化對象

其中哪些是正確的?

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

} 
+1

第二個是正確的 –

+3

一個快速測試應該顯示選項1不起作用,選項2不起作用... – Wain

回答

2

對象屬性

測試自己的代碼爲好,最好的辦法明確設置爲nil在Objective-C,以避免未初始化的對象問題,其他語言可以有。

非對象屬性設置爲零版本(即CGFloat爲0.000000,NSRange爲{0,0},BOOL爲否)。

因此,你的第二個代碼是正確的,但如果你已經分配和初始化self.bgImageView任何時間self.bgImageView.image = ...之前(例如你的第一個代碼會工作,在您的視圖控制器的init方法或loadView甚至高於self.bgImageView.image行)。

+0

只需提及另一種初始化'self.bgImageView'的可能性:將其屬性聲明爲'IBOutlet'並在故事板或xib文件中配置視圖。 –

1

看跌的alloc和init在.m文件,只把@property在.H如果其他一些VC需要訪問對象,否則只是在用它的。米以及。學習