這裏是我的情況:我有一個管理子視圖的層次結構中的UIViewController
,也許如下圖所示:保持一個鏈接到子視圖在視圖控制器
這種觀點是從.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
這樣,我得到了我想要的:
- CustomViewClass的上一個實例屏幕...
- ...與正好一個所有者,其超級... ...
- ...並沒有揮之不去變量(在塊結束後立即釋放customButtonLocal)。
但是,這不能是「正確」的方式來做到這一點。所以,最後,我的問題:
如何應該我被分配和不使用這個中間人的解決方法實例以編程方式創建__weak
變量?
有道理。謝謝! – ravron
導致內存泄漏 –
@JonasAlves心靈比這更具體嗎?什麼具體導致內存泄漏?在什麼情況下? 100%清楚的是答案不會導致OP的內存泄漏,所以我非常感謝你的解釋。 – dasblinkenlight