簡體   English   中英

可以用自己的 initWithFrame 初始化 class 嗎?

[英]Is it ok to initialize a class with your own initWithFrame?

我正在將 iPhone 應用程序轉換為通用應用程序。 我有一個 NIB 視圖,我想按原樣在 iPad 上使用它,但已調整大小和定位。 在 iPhone 上,我使用 initWithNibName 正常初始化...

 EventEditViewController *eventEditViewController = [[EventEditViewController alloc] initWithNibName:@"EventEditViewController" bundle:nil];

我發現由於各種原因,這對我來說在 iPad 上效果不佳。 因此,我創建了自己的初始化方法,以便在 iPad 上運行時調用...

EventEditViewController *eventEditViewControllerForIPad = [[EventEditViewController alloc] initWithFrame:iPadFrame eventDate:longDate event:eventName delegate:self];

這解決了幾個問題。 一種如何調整大小和 position 我想要的視圖以及如何正確初始化某些變量。 實際上,我傳遞的變量比您在這里看到的要多。

它工作得非常好,但我剛剛注意到,與 initWithNibName viewDidLoad 在我的 initWithFrame 方法之前觸發不同。 我之所以發現這一點,是因為我試圖在 viewDidLoad 中訪問的變量顯示為僵屍,我認為我是在我的 initWithFrame 方法中對其進行初始化。

我對這種行為感到驚訝。 正常嗎? 對我來說,在 alloc/init 調用中的命名 initMethod 之前加載視圖是沒有意義的。

我現在想知道我所做的可能不是一件好事。 就像我說的那樣效果很好,但是我不應該在這里使用自己的初始化方法嗎?

如果可以這樣做,也許有人可以解釋為什么視圖在 init 方法之前加載。

謝謝,

約翰

如果您的-initWithFrame:...方法正在訪問視圖控制器的view屬性, -viewDidLoad將在 init 方法完成之前被調用,因為view訪問器將導致視圖被加載。

至於是否可以使用自己的方法,只要你的init方法調用class的指定初始化器就可以了。

初始化成員變量應該在 viewDidLoad 或 awakeFromNib 中完成。 awakeFromNib 是當視圖從 Xib 變為現實時調用的第一個方法。

最好使用 viewDidLoad 為巨大的 arrays 分配 memory,因為您可以在 viewDidUnload 中取消分配它們。

當其他視圖需要更多 memory 時,導航 controller 和標簽欄 controller 都使用視圖加載方法來卸載視圖。

應盡可能避免以任何其他方式進行分配。

來自 Apple 的 PageControl 源代碼

// load the view nib and initialize the pageNumber ivar
- (id)initWithPageNumber:(int)page
{
    if (self = [super initWithNibName:@"MyView" bundle:nil])
    {
        pageNumber = page;
    }
    return self;
}

您可以在該 EventEditViewController 中定義自己的自定義 init 方法,並且可以使用上述自定義方法來初始化 viewController 並根據需要設置任意數量的成員變量,例如 iPadFrame、longDate、eventName 等。

只需確保您完全按照上面的方式調用它,因為在此類自定義 init 方法中調用超級實現很重要。

也只是為了更清楚地說明應該在哪里釋放您在 viewDidLoad 方法中創建的 arrays,除了 viewDidUnload 之外,它首先是 dealloc 方法。 這背后的原因是 viewDidUnload 方法並不總是被調用。 只有當應用程序開始接收 memory 警告時才會調用它。 與此相比,當您釋放初始化的 viewController 並且它的保留計數達到 0 時,總是會自動調用方法 dealloc。您應該釋放您初始化 viewDidLoad 方法的 arrays 和您在 dealloc 方法中的其他保留屬性。

另請記住,當應用收到 memory 警告時,實際上是釋放額外 memory 的機會。 此外,除了當時可見的視圖控制器之外,memory 中的所有視圖控制器都會調用 viewDidUnload 方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM