2013-04-23 44 views
0

我更喜歡爲我的所有視圖控制器創建自定義視圖。我把它定義在代碼中使用了這樣的自定義視圖弱引用:具有自定義視圖和弱引用的UIViewController

#import "MyViewController.h" 
#import "MyCustomView.h" 

@interface MyViewController() 
@property (nonatomic, weak) MyCustomView *customView; 
@end 

@implementation MyViewController 
- (void) loadView 
{ 
    MyCustomView *view = [MyCustomView new]; 
    self.view = view; 
    self.customView = view; 
} 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    // work with custom view 
    self.customView.tableView.delegate = self; 
    .... 
} 

@end 

這是正確的使用弱引用的?應用程序是否會崩潰或泄漏,還是會有其他問題?

+1

@Rob我同意這就是爲什麼我建議剛重寫'customView' getter方法,所以至少你不必一直投射。 – 2013-04-23 15:50:07

回答

2

在這種情況下weak是好的。您將其分配給CustomViewself.viewUIViewController標題定義爲

@property(nonatomic,retain) UIView *view; 

所以view酒店有固定的參考。

有你viewcustomView可能不同步的可能性 - 所以我會被誘惑定義customViewreadonly和落實吸氣劑

- (CustomView *)customView 
{ 
    return (id)self.view; 
} 
+0

+1我對定義單獨的屬性並不是瘋狂的。另外,如果使用NIB或storyboard,我不喜歡實例化一個'MyCustomView',而是Rost可以在IB中恰當地定義頂層視圖的自定義類來開始,並讓標準的NIB /場景加載邏輯小心對他來說。 – Rob 2013-04-23 15:53:18

+0

@ Paul.s是的,與方法,而不是財產的好主意。我相信我會用這種方法。 – 2013-04-23 15:58:09

0

當您以編程方式從此控制器內創建實例時,應該使用強引用將所有權清楚地設置到此控制器。

如果您分別在IB或soryboard中創建視圖對象,則會對相關的IBOutlet進行弱引用。

+0

感謝您的重播Herman。 但強大的鏈接到創建的視圖持有與self.view屬性的視圖控制器。所以,直到self.view將是有效的'self.customView'也是有效的。在'self.view'將被View Controller的內部邏輯破壞之後'self.customView'也將被銷燬。在這種情況下,我沒有看到任何問題。 – 2013-04-23 15:43:03

+1

啊,是的。我忽略了你指的是兩個'指針'中的視圖對象。好吧。其中一個強者應該就夠了。 – 2013-04-23 16:37:55

1

正如您在documentation of UIViewController中看到的那樣,視圖控制器的視圖屬性對視圖有很強的參考。因此,只要您不將視圖屬性設置爲其他內容,自定義視圖對象就會保留。總之,你的方法有效。

相關問題