2012-04-24 27 views
5

我不能完全弄清楚我所看到的被稱爲和Objective-C 「類繼續」。這是/是這些...什麼是Objective-C「類延續」?

  1. 伊瓦爾(S)在@implementation.m)申報文件?
  2. 類別類別的另一個名稱? (不太可能,ASFAIK類別不能有Ivars,句點)
  3. 類擴展的另一個名稱?
  4. 還有別的嗎?

這就是說...

  1. 的範圍是什麼,壽命和使用,這樣的事情呢?
  2. 這是一個ARC特有的「功能」?
  3. 是否有特定的運行時間或其他使用要求?
  4. 這是一個合適的地方創建一個@property,以及?爲什麼這會成爲設置ivars或屬性的好地方,比如說@interface文件/聲明?
  5. 爲什麼人們通過使用這些特定的術語來使討論複雜化 - 這似乎並不存在於任何官方文檔中(我可以找到)?

在問題In Objective-C what is the difference between defining something (say a property) in the header file as opposed to the .m file? 的討論觸及到這個問題,但那種只是使問題變得更加 - 或者至少不能提供該術語的標準基準/定義......因此這個問題。

+0

根據鏈接問題中的評論..「匿名類別的正確術語是'類繼續',它與分類不同,因爲它可以包含其他字段。」或一些其他問題[這裏](http://stackoverflow.com/questions/172598/best-way-to-define-private-methods-for-a-class-in-objective-c)或[這裏](http ://stackoverflow.com/questions/827242/can-i-create-properties-with-a-public-getter-and-private-setter) – 2012-04-24 16:15:55

+0

該報價實際上是一個非常糟糕的類擴展描述。 – 2012-04-24 18:00:53

回答

6

A 延續課是Apple稱之爲class extension。我曾經見過clang稱他們爲「繼續課」,而gcc使用「繼續課」。

在鐺或GCC編譯如下:

@interface Foo : NSObject 
@property int a; 
@end 

@interface Foo() 
@property float a; 
@end 

...,你會得到與古怪名字的錯誤。

要回答你的問題的其餘部分:

  1. 的範圍是什麼,壽命和使用,這樣的事情呢?

擴展用於聲明類的私有接口。您也可以使用它來重新聲明(提煉)公共財產聲明。

  • 這是一個具體的ARC-的 「功能」?
  • NO。

    1. 是否存在特定的運行時或其他要求?

    類擴展是編譯時的概念,不需要特殊的運行時。當然,他們確實需要一個支持它們的編譯器(clang和gcc在當前版本中都有)。

    1. 這是創建@property的合適位置嗎?爲什麼這會成爲設置ivars或屬性比@interface文件/聲明更好的地方?

    是的。因爲你可能想擁有私人財產。

  • 人爲什麼要複雜化,通過使用這種專用術語的討論 - 這似乎沒有任何官方文件中不存在(即我能找到)?
  • 嗯,你知道...我也寧願彷彿整個世界都講英語,但暫時我很高興的是,我必須瞭解它在學校。

    +0

    在非易碎的abi(即32位)之前,擴展名更多地屬於正常類別,不能用於聲明私有ivars ... – 2012-04-24 16:30:30

    +1

    聲明私有ivars當然依賴於Objective-C 2.0的運行時,無論它們是在類擴展還是@implementation中聲明的。將它們放入類擴展中僅在clang中受支持。類擴展的功能並沒有被觸及。 – 2012-04-24 16:37:55

    +1

    我發現比較類別擴展與類別是沒有用的。雖然語法相似,但它們具有不同的目的,並具有其他編譯時和運行時特徵。 – 2012-04-24 16:42:40