2014-01-15 28 views
2

我正在關注iTunes U上的斯坦福大學開發iOS 7課程2013 2014(僅供參考),而且我對Objective C語言有一些一般性問題。謝謝你的幫助!關於Xcode iOS 7的常見問題目標C

問題01 這是我對@synthesize的瞭解: 使用最新版本的Xcode,不需要執行@synthesize來聲明setter或getter。如果getter和setter保持默認狀態,它會自動爲程序員完成。然而,我已經被教過了,我需要在重寫getter和setter時聲明合成。 我的問題是:爲什麼只有當兩者都被覆蓋?對於我來說,當只有一個需要被覆蓋的時候,你需要聲明合成已經變得更有意義了。

問題02

- (void)addCard:(Card *)card atTop:(BOOL)atTop; 
- (void)addCard:(Card *)card; 

是在我下面的過程中使用的2種不同的公共方法。 問:我需要說明這兩個方法是兩種。我不能只使用第一個,同時指定2個不同的代碼塊來執行,通過IF ELSE clausule BOOL是YES還是NO?這不會是完全一樣的結果嗎?

問題03

有隻是一個單一的視圖一個相當簡單的程序,我發現我並不需要公開指定我viewcontroller.h任何方法。我認爲這隻有在您的程序更加複雜時才需要,並且包含多個MVC,控制器需要相互「說話」。這是一個正確的假設,一般來說,當做一個適當的MVC爲基礎的程序?

我感謝您的時間和精力。對不起,如果我的問題看起來很基本或者沒有完全意義。我在iOS學習路徑階段1,有很少的OOP經驗。

+5

最好每個帖子只問一個問題。製作多個帖子是免費的。 – Caleb

+0

Wilco下一次! – N34X

回答

3

問題1:

你是對的這件事。如果你重寫getter和setter,那麼你需要@synthesize屬性。不過,我必須進一步尋找原因。

問題2:

是的,你可以只是第一種方法。然而,第二種方法是有一個方便,通常會包含代碼這樣的事情...

- (void)addCard:(Card *)card 
{ 
    [self addCard:card atTop:YES]; 
} 

然後指定的方法會做這樣的事情......

- (void)addCard:(Card *)card atTop:(BOOL)atTop 
{ 
    if (atTop) { 
     // something to add card to top. 
    } else { 
     // something to add card at bottom. 
    } 
} 

即它只是路線該方法調用「指定」方法,但使用BOOL的默認值。

問題3:

.h文件是存在的作爲接口的文件。它將類似於服務器上的一組Web服務。該類可以在內部完成各種各樣的任務,但只需要在.h接口文件中聲明一些東西,如果需要從外部訪問它們。

例如,您可能有一個名爲Car的類。它可能有一個名爲accelerator的按鈕,它可以訪問內部方法並提高速度。這些都不需要暴露於外部類別。

但是,同一輛車可能有一個名爲colour的屬性或稱爲addFuel的方法。這些需要在外部可用,以便用戶可以看到顏色並添加燃料。這兩個都需要進入.h文件。

我希望這是有道理的。

+0

我不明白1號;如果你已經提供了getter和setter實現,那麼還有什麼需要綜合的? – trojanfoe

+1

@trojanfoe我認爲合成也將財產鏈接到伊娃。這就是剩下要綜合的東西。 –

+0

@Thedude但是沒有必要,因爲getter/setter會明確地使用正確的實例變量。 – trojanfoe

-1

問題01

編輯)您需要@synthesize告訴編譯器爲您創建的實例變量(如:_myString)。您也可以手動聲明伊娃。

問題02

你可以只聲明的第一個肯定的。其實第二個只是一個速記方法,爲atTop提供了一個默認值。在大多數情況下,你會實現完全按照自己的解釋方法:

- (void)addCard:(Card *)card atTop:(BOOL)atTop { 
    if (atTop) { 
     // atTop == YES 
    } 
    else { 
     // atTop == NO 
    } 
} 

- (void)addCard:(Card *)card { 
    [self addCard:card atTop:YES]; // or atTop:NO, depending of the default value you want to use 
} 

問題03

再次,是的。您的視圖控制器應該儘可能少地暴露屬性和方法,並且公開只有應用程序可以使用的其他應用程序才能使用的東西。所以在單個VC /單視圖程序的情況下,具有空的VC接口是正常的。

+0

感謝您的回覆。怎麼樣一個簡單的@synthesize訴訟= _suit;供私人使用?這是一個錯誤的編程方法,可以編程嗎? – N34X

+0

@Fogmeister,你說得對,我猜想我沒有太頻繁地實現我的屬性的getter *和* setter。我確定了答案。 –

+0

因此,當只有一個getter或一個正在被默認自動重寫的setter時,你不需要@synthesize行?例如,我只讓Xcode編譯器自動完成所有的getter和setter。但是,我想將getter的名稱調整爲代碼中更易讀的內容。在那種情況下,我不需要合成線,對嗎?當我想要改變getter和setter名稱時,我確實需要合成線? – N34X

1

問題1:我已經被教過了,我需要聲明合成時 覆蓋吸氣劑和二流子。我的問題是:爲什麼只有 當兩個被覆蓋?對於我而言,當你需要重寫 時, 需要聲明已經合成了嗎?

一旦你使用@synthesize你使用的是編譯器提供的setter/getter。如果你創建你的setter/getter沒有synthesize那麼你需要寫兩個方法,如果你有readwrite屬性。


問題2:我是否需要註明這兩個爲2個人的方法。 我不能只使用第一個,同時指定2個不同的 代碼塊,通過IF ELSE clausule判斷BOOL是否爲 YES或NO?這不會是完全一樣的結果嗎?

是的,有兩種不同的方法是很好的。由於這兩個參數有所不同,調用者將知道該方法內發生了什麼。如果你想放置if-else,爲此你需要一個ivar或全局值來檢查,但是如果你通過BOOL則不需要它。


問題3:有,只是一個單一視圖一個相當簡單的程序,我發現我 不需要公開指定我viewcontroller.h任何方法。 I 認爲只有當程序更加複雜時才需要這樣做,並且 包含多個MVC,其中控制器需要互相「說」 。這是一個正確的假設,一般來說,當製作一個合適的基於MVC的程序時,可以使用 ?

即使您沒有任何複雜但始終遵循MVC的體系結構。

iOS編程中的控制器通常是指視圖控制器。將視圖控制器視爲模型和視圖之間的橋樑。該控制器解釋一方發生了什麼,並根據需要使用該信息來改變另一方。例如,如果用戶更改視圖中的某個字段,控制器將確保模型作出響應更改。如果模型獲取新數據,控制器會通知視圖來反映它。