NSObject 類別
定義
重要
部分資訊涉及發行前產品,在發行之前可能會有大幅修改。 Microsoft 對此處提供的資訊,不做任何明確或隱含的瑕疵擔保。
對應至 Objective-C 物件之所有系結物件的基類。
[Foundation.Register("NSObject", true)]
public class NSObject : Foundation.INSObjectProtocol, IDisposable, IEquatable<Foundation.NSObject>
type NSObject = class
interface INSObjectProtocol
interface INativeObject
interface IDisposable
interface IEquatable<NSObject>
- 繼承
-
NSObject
- 衍生
- 屬性
- 實作
備註
這是用來將 Objective-C 類別系結至 C# 類別的基類。 只有來自 NSObject 的子類別化會產生可傳遞至 Objective-C 的類別。
C# NSObject 類別及其子類別是基礎 Objective-C 實例的 Managed 標記法。 Unmanaged 程式碼 Objective-C 物件的指標會儲存在 屬性中 Handle 。
請務必注意,目前編譯器不支援 NSObject 的泛型子類別。
類別註冊
當您建立 NSObject 的子類別時,此子類別會根據實作詳細資料的完整 .NET typename,向 Objective-C 執行時間註冊名稱。 如果您需要確保 C# 類別是以 Objective-C 執行時間中的特定名稱公開,您可以將套用至類別,並指定您想要類別擁有的名稱。
使用 Interface Builder XIB 和 Storyboard 檔案時,或當您使用 Objective-C 序列化設定時,或當您使用 Objective-C 序列化設定 (,例如使用 NSCoder) 時,通常會使用上述方法參考類別。
//
// This exposes the C# class _MySampleView as the Objective-C MyView
//
[Export ("MyView")]
public class _MySampleView : UIView {
}
Objective-C 方法
一般而言,MonoTouch 類別會將一個對應到基礎 Objective-C 類別。 例如,C# 類別 「MonoTouch.Foundation.NSObject」 會對應至 Objective-C 「NSObject」 類別。 但方法不同。 Objective-C 方法無法妥善轉譯為 C# 方法,因此它們一般已改變,以符合 C# 語言、C# 慣用語和.NET Framework設計指導方針。
Objective-C 方法會以 C# 呈現為已套用特殊的虛擬方法。 編譯器會使用這個屬性,將 C# 名稱對應至 Objective-C 名稱。 這些屬性會顯示在每個函式的 API 檔中,以協助您識別特定 C# 方法所呼叫的 Objective-C 方法。
若要改變您使用標準 C# 慣用語的類別行為:建立子類別,並覆寫您想要改變及使用「base」 的方法。 選擇性地呼叫基類的語言功能。
public class MyView : UISlider {
public override void Draw (RectangleF rect)
{
// Let the base class draw first
base.Draw (rect);
// Our custom code
var ctx = UIGraphics.GetCurrentContext ();
UIColor.Gray.SetColor ();
ctx.StrokeEllipseInRect (rect);
}
}
根據預設,只有已覆寫的方法會公開給 Objective-C 世界。 如果您想要向 Objective-C 世界公開任意 C# 方法,您必須將套用至公用方法。 這可以同時處理靜態和實例方法。 套用 屬性之後,方法會公開至 Objective-C,而且執行時間所支援的標準資料類型封送處理作業可供這些方法使用。
//
// Exposes the class StringUtilities to Objective-C with the
// method:
// - (NSString *) joinArray:(NSArray *) stringArray withSeparator:(NSString *sep);
//
// Used like this:
// id utilities = [[StringUtilities alloc] init];
// NSLog (@"Joined: %@", [utilities joinArray:users withSeparator:@", "]);
//
public class StringUtilities : NSObject {
[Export ("joinArray:withSeparator:")]
public string Join (string [] array, string separator)
{
return string.Join (separator, array);
}
}
生命週期
C# NSObject 及其子類別是基礎 Objective-C 物件的 Managed 包裝函式。 當您使用 「new」 運算子建立新的實例時,或當現有的 Unmanaged 物件呈現至 C# 世界時,會從 C# 建立這些實例。
當您使用 「new」 運算子從 C# 建立物件時,物件一開始會由 C# 擁有,而 C# 會保留物件的參考。 只有在垃圾收集行程判斷沒有暫止的 Managed 參考時,或當您在物件上手動呼叫 Dispose 方法時,才會卸載此參考。
當您叫用方法或傳回 NSObject 的屬性時,也會視需要建立 C# NSObject。 此時,執行時間會查看物件快取,並判斷指定的 Objective-C NSObject 是否已呈現至受控世界。 如果物件已呈現,則會傳回現有的物件,否則會叫用接受 IntPtr 做為參數的建構函式來建構物件。
單純的「對等」架構物件 (那些只是 Objective-C 物件的 C# 標記法的物件,而且沒有額外的 Managed 關聯狀態,) 可以使用先前所述的建構函式,依需求重新建立執行時間。
NSObjects 的使用者子類別通常包含 C# 狀態,因此每當 Objective-C 執行時間對其中一個物件執行「保留」作業時,執行時間都會建立 GCHandle,讓 Managed 物件保持運作,即使沒有 C# 可見的物件參考也一樣。 這可簡化預約,因為狀態會自動為您保留。
NSObject 上的 Dispose 作業一律會卸載基礎 Objective-C 物件的參考,但不會終結 Managed 狀態,這只會在 Managed 程式碼和 Unmanaged 程式碼都釋放物件時發生。 這與 .NET 稍有不同,因為在處置物件之後,在 .NET 上,就無法叫用物件上的任何方法,因為它被視為無用。 這不是 NSObjects 的情況。
採用通訊協定
在 MonoTouch 中,大部分 Objective-C 通訊協定都會對應至已套用 T:ObjCRuntime.ModelAttribute的類別。 而採用通訊協定的方式是子類別化和覆寫您想要採用的方法。
在某些情況下,您想要自行採用臨機操作通訊協定。 如果您需要採用 Objective-C 通訊協定,您應該在 類別上使用 AdoptsAttribute ,並提供您想要採用的通訊協定名稱。 一般而言,採用通訊協定時,您也必須列出您使用所採用的所有 Objective-C 選取器。
[Adopts ("NSLocking")]
public class MyLockeingObject : NSObject {
[Export ("lock")]
public void Lock ()
{
// ...
}
[Export ("unlock")]
public void Unlock ()
{
// ...
}
}
機碼值編碼
機碼值編碼是一種機制,可讓您依其名稱存取物件的屬性,而不是使用 C# 方法直接存取它們。
若要將 C# 屬性公開至Key-Value程式碼撰寫系統,您只需要將新增至屬性。 名稱只能包含 ASCII 字元、以小寫字母開頭,且不得包含任何空格。
public class CircleLayer : CALayer {
[Export ("radius")]
public double Radius { get; set; }
// ...
}
您可以使用 Foundation.ValueForKey (Foundation.NSString) ;*方法來查閱屬性,並使用 M:Foundation.SetValueForKey (Foundation.NSObject、Foundation.NSString) ;*「方法來設定指定屬性的值。 例如,您可以呼叫 foo。ValueForKey (「user」) ,以擷取 物件中使用者屬性的值。
此外,您可以使用索引鍵路徑讓執行時間重複呼叫 ValueForKey 或 SetValueForKey。 您可以使用點分隔索引鍵。 例如,keypath 「user.address.phone.mobile」 會要求使用者屬性,然後在使用者上要求位址屬性,然後要求位址上的電話屬性,最後要求手機上的行動屬性,最後使用結果做為值。 您可以使用 M:Foundation.ValueForKeyPath (Foundation.NSString) ;*來查閱使用索引鍵路徑的屬性, 並使用 M:Foundation.SetValueForKeyPath (Foundation.NSObject、Foundation.NSString) ;*來設定值。
使用索引鍵路徑時,如果查閱失敗, SetValueForUndefinedKey(NSObject, NSString) 則會在設定值時叫用 ,並在 ValueForUndefinedKey(NSString) 查閱值時叫用 。 這兩種方法預設都會引發 Objective-C 例外狀況,您可以藉由覆寫方法來改變該行為。
觀察索引鍵值
索引鍵值觀察是由 NSObject 所實作的機制,可用來監視透過機碼值編碼系統對 NSObject 所做的變更。
若要讓類別觀察通知,您必須覆寫 ObserveValue(NSString, NSObject, NSDictionary, IntPtr) 方法,以特定索引鍵路徑的值變更相關資訊來叫用此方法。 然後,您可以使用 AddObserver(NSObject, NSString, NSKeyValueObservingOptions, IntPtr) 開始觀察變更,以及 RemoveObserver(NSObject, NSString, IntPtr) 停止接收通知的方法。
建構函式
NSObject() |
預設建構函式,這個建構函式會初始化這個類別的新實例,不含任何參數。 |
NSObject(IntPtr) |
建立 Unmanaged 物件的 Managed 標記法時所使用的建構函式;由執行時間呼叫。 |
NSObject(IntPtr, Boolean) |
建立 Unmanaged 物件的 Managed 標記法時所使用的建構函式;由執行時間呼叫。 |
NSObject(NSObjectFlag) |
呼叫衍生類別的建構函式,以略過初始化,並只配置 物件。 |
欄位
MonoMacAssembly |
已淘汰.
對應至 Objective-C 物件之所有系結物件的基類。 |
MonoTouchAssembly |
已淘汰.
指向 montoouch 元件。 |
PlatformAssembly |
對應至 Objective-C 物件之所有系結物件的基類。 |
屬性
ChangeIndexesKey |
表示與常數 NSKeyValueChangeIndexesKey 相關聯的值 |
ChangeKindKey |
表示與常數 NSKeyValueChangeKindKey 相關聯的值 |
ChangeNewKey |
表示與常數 NSKeyValueChangeNewKey 相關聯的值 |
ChangeNotificationIsPriorKey |
ChangeNotificati 的通知常數 |
ChangeOldKey |
表示與常數 NSKeyValueChangeOldKey 相關聯的值 |
Class |
對應至 Objective-C 物件之所有系結物件的基類。 |
ClassHandle |
這個類別的控制碼。 |
DebugDescription |
此物件的開發人員有意義描述。 |
Description |
物件的描述,ToString 的 Objective-C 版本。 |
Handle |
處理非受控物件標記法) (指標。 |
IsDirectBinding |
對應至 Objective-C 物件之所有系結物件的基類。 |
IsProxy |
對應至 Objective-C 物件之所有系結物件的基類。 |
RetainCount |
傳回物件的目前 Objective-C 保留計數。 |
Self |
對應至 Objective-C 物件之所有系結物件的基類。 |
Superclass |
對應至 Objective-C 物件之所有系結物件的基類。 |
SuperHandle |
用來表示這個 NSObject 基類中方法的控制碼。 |
Zone |
對應至 Objective-C 物件之所有系結物件的基類。 |
方法
擴充方法
ObjectDidBeginEditing(NSObject, INSEditor) |
對應至 Objective-C 物件之所有系結物件的基類。 |
ObjectDidEndEditing(NSObject, INSEditor) |
對應至 Objective-C 物件之所有系結物件的基類。 |
GetValidModes(NSObject, NSFontPanel) |
對應至 Objective-C 物件之所有系結物件的基類。 |
ValidateToolbarItem(NSObject, NSToolbarItem) |
對應至 Objective-C 物件之所有系結物件的基類。 |
GetDebugDescription(INSObjectProtocol) |
對應至 Objective-C 物件之所有系結物件的基類。 |
AcceptsPreviewPanelControl(NSObject, QLPreviewPanel) |
對應至 Objective-C 物件之所有系結物件的基類。 |
BeginPreviewPanelControl(NSObject, QLPreviewPanel) |
對應至 Objective-C 物件之所有系結物件的基類。 |
EndPreviewPanelControl(NSObject, QLPreviewPanel) |
對應至 Objective-C 物件之所有系結物件的基類。 |
GetAccessibilityCustomRotors(NSObject) |
取得物件適用的 |
SetAccessibilityCustomRotors(NSObject, UIAccessibilityCustomRotor[]) |
設定適用于 |