2012-07-03 173 views
2

這裏是我的情況:我有一個管理子視圖的層次結構中的UIViewController,也許如下圖所示:保持一個鏈接到子視圖在視圖控制器

View hierarchy

這種觀點是從.xib建。我希望能夠繼續獲得冠捷的每個子視圖 - 也就是說,我想一個指向每個這樣我就可以,例如,這樣說:

[button1 setText:@"Hello!"]; 

通常情況下,要做到這一點,我線了每一個元素,我想使用Interface Builder訪問,導致看起來像這樣的標題:

@interface MyViewController : UIViewController 
{ 
    __weak IBOutlet UIView *view; 
    __weak IBOutlet UILabel *label; 
    __weak IBOutlet UIButton *button1; 
    __weak IBOutlet UIButton *button2; 
} 

@end 

這些實例變量__weak,這是很好的,因爲我的視圖控制器「獲取時間「他們,他們已經擁有我的視圖控制器的根視圖(這令人困惑,我在我的快速圖中標記爲」topView「)。事實上,我希望這些引用很弱 - 當我的根視圖發佈時,它的所有子視圖也應該發佈。大。

但是,讓我們說我想創建一個新的UI元素,可能是一個自定義按鈕,完全在代碼中。我會將這個元素稱爲CustomViewClass,這個元素將從UIView中繼承。我將創建的CustomViewClass的實例將被稱爲customButton。與我的觀點的其他子視圖一樣,我想「訪問」到customButton,以便我可以與其交互。然而,我知道,像其他任何子視圖一樣,customButton將歸其superview所有,這就是它應該是的 - 我希望它在我的觀點發布時能夠發佈。這讓我認爲我應該聲明這個視圖爲__weak實例變量或我的視圖控制器的屬性。讓我們做的是:

@interface MyViewController : UIViewController 
{ 
    __weak IBOutlet UIView *view; 
    __weak IBOutlet UILabel *label; 
    __weak IBOutlet UIButton *button1; 
    __weak IBOutlet UIButton *button2; 
    __weak CustomViewClass *customButton; 
} 

@end 

然後,在我的實現:

@implementation MyViewController 
- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    customButton = [[CustomViewClass alloc] init]; 
    [[self view] addSubview:customButton]; 
} 
@end 

正如你可能已經意識到,這是不行的,而編譯器將拋出一個警告啓動。喜歡的東西:

Assigning retained object to weak variable; object 
will be released after assignment 

我目前躲閃這種與一些很差的風格警告:

@implementation MyViewController 
- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    CustomViewClass *customButtonLocal = [[CustomViewClass alloc] init]; 
    [[self view] addSubview:customButtonLocal]; 
    customButton = customButtonLocal; 
} 
@end 

這樣,我得到了我想要的:

  1. CustomViewClass的上一個實例屏幕...
  2. ...與正好一個所有者,其超級... ...
  3. ...並沒有揮之不去變量(在塊結束後立即釋放customButtonLocal)。

但是,這不能是「正確」的方式來做到這一點。所以,最後,我的問題:

如何應該我被分配和不使用這個中間人的解決方法實例以編程方式創建__weak變量?

回答

2

使CustomViewClass *customButton有很強的參考價值。

您爲什麼通常將子視圖的變量聲明爲__weak IBOutlet的原因是這些鏈接的存在並不意味着所有權。子視圖由從NIB/Storyboard實例化的對象擁有。您直接擁有該對象,並且還間接擁有它的依賴對象。

customButton是一個不同的故事:你以編程方式創建它,所以你的NIB/Storyboard不擁有它。因此,您應該參考它__strong(這是沒有ARC修飾符時的默認值)。

+0

有道理。謝謝! – ravron

+0

導致內存泄漏 –

+0

@JonasAlves心靈比這更具體嗎?什麼具體導致內存泄漏?在什麼情況下? 100%清楚的是答案不會導致OP的內存泄漏,所以我非常感謝你的解釋。 – dasblinkenlight

相關問題