2013-03-19 41 views
1

我應該更好總是網點是否有getter/setter?

@interface MyClass 
    { 
     NSTextField * myTextField ; 
    } 
    @property (assign) NSTextField * myTextField ; 

或只是

@interface MyClass 
    { 
     NSTextField * myTextField ; 
    } 

爲什麼我有理由認爲,我們應該添加@property行:

  • 我最近有一個程序,如果出口沒有一個getter/setter方法,這將無法正常工作。

  • 加:我們發現當一個項目創建

    @property (assign) IBOutlet NSWindow *window; 
    
+1

IBOutlets僅適用於屬性。很少需要在你的類的頭文件中使用iVars,或者將它放在類擴展中或@implementation中。 – 2013-03-19 16:58:31

+0

你能澄清你的評論嗎?什麼是iVar? Plus:我總是被告知/顯示在'.h'中聲明一個類的屬性。你只是說,如果有一個@屬性,那麼我不需要在之前聲明屬性? – Colas 2013-03-19 17:01:15

+0

@ RichardJ.RossIII,雖然我很挑剔,但你的第一句話是錯誤的。 IBOutlets可以用來裝飾一個實例變量,即使沒有對應的@屬性。這是在Objective-C 2.0之前完成的正常(唯一)方法,並且仍然有效。 100%同意你的第二句話。 – 2013-03-19 18:05:25

回答

1

所有你需要的是Interface Builder使用IBOutlet的屬性。如果您不使用Interface Builder,則不需要IBOutlet。如果你不使用Interface Builder,你甚至可能根本不需要屬性(屬性通常是公共的,而實例變量總是私有的)。

@interface MyClass : UIViewController 

@property (assign) IBOutlet NSTextField *myTextField ; 

您不需要創建實例變量或將它合成爲它爲您完成的工作。

您可以在代碼中使用self.myTextField進行訪問。

+0

上使用XCode4.4 +編譯器的新功能。那麼,@ @ synthetize有什麼用? – Colas 2013-03-19 17:17:39

+1

'@ synthesize'用於爲您的屬性自動創建獲取者/設置者。它本身就是一條捷徑。但是現在'@ synthesize'自Xcode 4的屬性自動打開。4 – 2013-03-19 17:19:18

+3

實例變量並不總是私有的。它們默認是私人的,但也可以公開或保護。 – 2013-03-19 17:19:26

3

一旦你創建了一個出口對象或任何其他對象,然後爲它創建伊娃一個property以下行(以新的編譯器)。

現在創建ivars和屬性已過時。 甚至property都與自動合成匹配。

如果你真的想要ivars,那麼你可以把它放在.m文件中,或者如果你希望它們是私人的,那麼就給它們添加一個擴展名。

如果出口有二傳手/吸氣

確實是這樣,你需要訪問他們很多次。如檢查單選按鈕的狀態,複選框,設置stringValue的是的NSTextField,由[的tableView reloadData]等

@interface MyClass 
    { 
     NSTextField * myTextField ; //this is ivar 
    } 
    @property (assign) NSTextField * myTextField ; //this is property 
@end 

不管你把.hpublic和方便,如果你想隱藏它做重裝表它在.m甚至在一個擴展。

+0

你是什麼意思「均勻屬性創建自動合成對象。」 ? – Colas 2013-03-19 17:14:42

+0

我以爲我們必須在'.h'中創建iVars?你說什麼新時尚? (我是初學者) – Colas 2013-03-19 17:15:54

+0

@Colas:查看我編輯過的答案,並且可以在osx10.7 + – 2013-03-19 17:38:06

1

我個人更喜歡,如果你需要你的對象引用範圍,在類之外,那麼去屬性聲明。否則,將其聲明爲類方括號內的實例變量,並將其作爲實現文件中的實例變量。(如果你沒有繼承這個變量功能進一步)

所以,

  • 如果需要訪問外部類的變量實例,然後聲明屬性。

    MyClassViewController *myClassViewController = [[MyClassViewController alloc] init]; 
    [myClassViewController.myTextField setText:@"MyValue"]; 
    

    還可以得到價值像

    NSLog(@"%@", [myClassViewController.myTextField text]); 
    
    • :在MyClassViewController.h頭文件

    @property (strong, nonatomic) IBOutlet NSTextField *myTextField;

    所以現在在其他類別,人們可以通過訪問該如果你不想這樣的公共訪問,但你想要得到繼承。然後在類聲明塊本身中聲明。在ViewController.h頭文件

    @interface ViewController { @public: // or @protected 
        NSString *myString; 
    } 
    

現在如果有哪個繼承的ViewController類,那麼這個屬性將在ChildViewController根據其訪問權限說明符得到繼承另一個類。

  • 如果你想完全隱藏屬性或變量。就像它甚至不在該類本身之外使用,那麼你可以在私有類別本身的實現文件(.m)中聲明它。在ViewController.m文件:

@interface ViewController() {

NSString *myString; 
} 

因此,這將是具有.m文件只,其他地方的知名度。

現在聲明@property - 只有當你需要setter-getter的默認方法(如setMyString等)時才需要聲明。這也可以根據您對該實例的可見性要求在.m和.m中聲明。

希望你現在得到的概念。其全部關於可見性。

+0

我的問題是特定的網點!無論如何,這是一個很好的答案。爲什麼不使用'@ private'而不是創建一個類別? – Colas 2013-03-19 17:39:11

+1

是的,你在這件事上是對的,即使我自己也有同樣的問題。但是,如果您從https://developer.apple.com/library/ios/navigation/#section=Resource%20Types&topic=Sample%20Code 下載任何最新代碼,則Apple本身正在使用此方法。所以最好和蘋果一起去。 – Mrunal 2013-03-19 17:43:06