2012-12-13 98 views
0

我在學Objective-C,只是好奇。我可以在這些地方創建一個NSString的對象,並請提供其他任何人。對我來說,他們都做同樣的事情。我不知道他們之間有什麼不同。它存儲在哪裏?我從哪裏可以訪問它?有什麼優勢?這三種聲明變量的方式有什麼區別?

1)

// .h 
@interface ... 
@property (strong,nonatomic) NSString *text; 
@end 

2)

// .h 
@interface ... { 
NSString *text 
} 
@end 

3)

// .m 
@interface ...() 
@property (strong,nonatomic) NSString *text; 
@end 
+0

那麼,第三個將不會工作,除非你添加'()'並將'@屬性'放在'@ end'之前。但是您需要了解屬性和實例字段之間的差異。 –

+0

請賜教。 – KKendall

+0

(您還需要在第一種情況下將該屬性放置在結尾之前。) –

回答

1

首先,我的回答是基於最新鏘編譯器,舊版本的工作稍有不同。

所以,你不是創建一個對象都沒有。你甚至沒有宣稱在其中兩個對象。

在第一種情況下,您實際上告訴編譯器您需要公開名爲text的屬性NSString。編譯器所做的是爲你自己聲明一個實例變量_text(你可以通過這種方式訪問​​而不會出現問題)以及獲取和設置實例變量所需的方法。正如你所看到的,存儲仍然是內部的,你只需要爲你設置getter和setter。

在第二種情況下,您實際上是自己聲明一個實例變量(ivar),就像編譯器使用_text一樣。用_作爲前綴是習慣用法。存儲仍然是內部的。最重要的是,你不能從外面訪問你的伊娃,因爲它沒有getter或setter,隱式聲明是@private

在第三種情況下,您將創建一個匿名類別(因此爲空圓括號),將類添加到您的類中。對於這個問題的存儲有點難以解釋,如果您對此感到好奇,可以搜索Apple文檔,查看類別是什麼等等。在這種情況下,你只能從你的課堂中訪問你的財產,這使得它在某種程度上是多餘的(吸氣者和設置者),你可以宣佈它是一個伊娃。

您也可以聲明你的高德這樣的:

@interface GenericViewController : UIViewController{ 
    NSString * text; 
} 

@end 



@implementation GenericViewController{ 
    NSString * text; 
} 

@end 

以上兩者具有本地存儲和私有可見(不能從外部訪問)。兩者之間的區別在於實現中聲明的實例變量隱式隱藏,可見性無法通過@public,@protected和@private進行更改。如果您使用這些指令,則不會收到編譯器錯誤,但會被忽略。

相關問題