NSObject 類別
定義
重要
部分資訊涉及發行前產品,在發行之前可能會有大幅修改。 Microsoft 對此處提供的資訊,不做任何明確或隱含的瑕疵擔保。
所有映射到 Objective-C 物件的綁定物件的基底類別。
[Foundation.Register("NSObject", true)]
[System.Runtime.InteropServices.ObjectiveC.ObjectiveCTrackedType]
public class NSObject : Foundation.INSObjectProtocol, IDisposable, IEquatable<Foundation.NSObject>
[<Foundation.Register("NSObject", true)>]
[<System.Runtime.InteropServices.ObjectiveC.ObjectiveCTrackedType>]
type NSObject = class
interface INativeObject
interface IEquatable<NSObject>
interface IDisposable
interface INSObjectProtocol
- 繼承
-
NSObject
- 衍生
- 屬性
- 實作
備註
這是用來將 Objective-C 類別綁定到 C# 類別的基底類別。 僅從 NSObject 進行子類別化,即可產生一個可傳遞給 Objective-C 的類別。
C# NSObject 類別及其子類別是底層 Objective-C 實例的管理式表示。 指向非管理程式碼 Objective-C 物件的指標會儲存在屬性 Handle 中。
值得注意的是,目前編譯器不支援 NSObject 的通用子類別。
班級註冊
當你建立 NSObject 的子類別時,這個子類別會以完整 .NET 型別名稱(實作細節)註冊給 Objective-C 執行時。 如果你需要確保 C# 類別在 Objective-C 執行時中暴露出特定名稱,你可以套用該 RegisterAttribute 類別並指定你想要的類別名稱。
上述通常用於你想在某些 Objective-C 程式碼中以名稱參照類別的情況,例如使用 Interface Builder XIB 和 Storyboard 檔案,或是使用 Objective-C 序列化設定(例如 使用 NSCoder)。
//
// This exposes the C# class _MySampleView as the Objective-C MyView
//
[Export ("MyView")]
public class _MySampleView : UIView {
}
Objective-C 方法
一般而言,類別會一一對應底層的 Objective-C 類別。 例如,C# 類別 NSObject 對應到 Objective-C 「NSObject」類別。 但方法不同。 Objective-C 方法無法很好地轉換成 C# 方法,因此通常已修改以符合 C# 語言、C# 成語及 .NET 框架設計指引。
Objective-C 方法會以虛擬方法的形式呈現到 C#,並套用了特殊 ExportAttribute 方法。 這個屬性被編譯器用來將 C# 名稱映射到 Objective-C 名稱。 這些屬性會顯示在 API 文件中,放在每個函式上方,幫助你辨識某個 C# 方法正在呼叫哪個 Objective-C 方法。
要改變類別的行為,你可以使用標準的 C# 慣用語:建立子類別並覆寫你想修改的方法,並使用「基底」。 語言功能可以選擇性地呼叫到你的基底類別。
public class MyView : UISlider {
public override void Draw (CGRect 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 世界。 如果你想讓一個任意的 C# 方法暴露給 Objective-C,你需要把它 ExportAttribute 套用到你的公開方法上。 這可以同時用於靜態和實例方法。 一旦該屬性套用,方法將暴露於 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);
}
}
Lifecycle
C# NSObject 及其子類是底層 Objective-C 物件的管理包裝器。 這些物件可以從 C# 建立,或是用「new」運算子建立新實例,或是將現有未管理物件浮現到 C# 世界時產生。
當你用「new」運算子從 C# 建立物件時,該物件最初會被 C# 擁有,且 C# 會保留對該物件的參考。 只有當垃圾回收器判斷沒有待處理的受管理參考,或你手動呼叫物件的 Dispose 方法時,這個參考才會被丟棄。
當你呼叫一個回傳 NSObject 的方法或屬性時,也會隨需建立 N# NSObject。 此時執行時會檢視物件快取,判斷某 Objective-C NSObject是否已經浮現到受管理世界。 若物件已被浮現,則會回傳現有物件,否則會呼叫一個以 IntPtr 為參數的建構子來構造該物件。
純粹的框架物件「對等」對象(即僅是 C# 表示的 Objective-C 物件,沒有額外管理狀態的物件)可透過前述建構子由執行時按需重建。
NSObject 的使用者子類別通常包含 C# 狀態,因此每當 Objective-C 執行時對這些物件執行「保留」操作時,執行時會建立一個 GCHandle,即使物件沒有 C# 可見的參考,也能維持該受管理物件的存活。 這大大簡化了破壞行為,因為狀態會自動為你保留。
NSObject 上的 Dispose 操作會總是丟棄對底層 Objective-C 物件的參考,但不會摧毀受管理狀態,這只會在受管理程式碼與非受管程式碼都釋放物件時發生。 這與 .NET 略有不同,因為在 .NET 中,一旦物件被處置,就無法對該物件呼叫任何方法,因為該物件被視為無用。 NSObjects則不是這樣。
採用協議
在 MonoTouch 中,大多數 Objective-C 協定都映射到套 ModelAttribute 用該協定的類別。 而採用協定的方式,就是透過子類別化並覆蓋你想採用的方法。
有些罕見情況是你想自己採用臨時協議。 如果你需要採用 Objective-C 協定,應該在你的類別中使用該 AdoptsAttribute 協定,並提供你想採用的協定名稱。 通常,採用協定時,你還需要列出所有你正在採用的 Objective-C 選擇器。ExportAttribute
[Adopts ("NSLocking")]
public class MyLockeingObject : NSObject {
[Export ("lock")]
public void Lock ()
{
// ...
}
[Export ("unlock")]
public void Unlock ()
{
// ...
}
}
關鍵值編碼
鍵值編碼是一種機制,讓你可以透過物件名稱存取其屬性,而不是直接用 C# 方法存取。
要將 C# 屬性暴露給 Key-Value 編碼系統,你只需要將 加入 ExportAttribute 你的屬性。 名稱必須僅包含 ASCII 字元,開頭為小寫字母,且不得包含空格。
public class CircleLayer : CALayer {
[Export ("radius")]
public double Radius { get; set; }
// ...
}
你用 Methods ValueForKey(NSString) 來用名稱查找屬性,使用 of functions SetValueForKey(NSObject, NSString) 方法來設定指定屬性的值。 例如,你可以叫 foo。ValueForKey(「使用者」)用來擷取物件中使用者屬性的值。
此外,你也可以使用金鑰路徑,讓執行時反覆呼叫 ValueForKey 或 SetValueForKey。 你用點來區分鍵。 例如,keypath 「user.address.phone.mobile」會先請求使用者屬性,接著請求使用者的地址屬性,接著又請求地址上的電話屬性,最後再請求手機上的行動屬性,最後以結果作為值。 你用 來 ValueForKeyPath(NSString) 用鍵路徑查找屬性,然後用鍵 SetValueForKeyPath(NSObject, NSString) 路徑設定值。
使用金鑰路徑時,如果查詢失敗, SetValueForUndefinedKey(NSObject, NSString) 設定值 ValueForUndefinedKey(NSString) 時會被調用,查找值時也會被調用。 這兩種方法預設都會觸發 Objective-C 例外,你可以透過覆寫這些方法來改變這個行為。
關鍵值觀測
關鍵值觀察是 NSObject 實作的一種機制,可用於透過關鍵值編碼系統監控 NSObject 的變更。
為了讓你的類別觀察到通知,你必須 ObserveValue(NSString, NSObject, NSDictionary, IntPtr) 覆蓋將被呼叫的方法,並包含特定金鑰路徑值變動的資訊。 接著你用 來 AddObserver(NSObject, NSString, NSKeyValueObservingOptions, IntPtr) 觀察變化,並用 RemoveObserver(NSObject, NSString, IntPtr) 方法停止接收通知。
建構函式
| 名稱 | Description |
|---|---|
| NSObject() |
所有映射到 Objective-C 物件的綁定物件的基底類別。 |
| NSObject(NativeHandle, Boolean) |
所有映射到 Objective-C 物件的綁定物件的基底類別。 |
| NSObject(NativeHandle) |
所有映射到 Objective-C 物件的綁定物件的基底類別。 |
| NSObject(NSObjectFlag) |
用來呼叫衍生類別跳過初始化,僅僅配置物件。 |
欄位
| 名稱 | Description |
|---|---|
| PlatformAssembly |
取得包含平台特定基礎類型的組裝。 |
屬性
| 名稱 | Description |
|---|---|
| AccessibilityAttributedUserInputLabels |
所有映射到 Objective-C 物件的綁定物件的基底類別。 |
| AccessibilityRespondsToUserInteraction |
所有映射到 Objective-C 物件的綁定物件的基底類別。 |
| AccessibilityTextualContext |
所有映射到 Objective-C 物件的綁定物件的基底類別。 |
| AccessibilityUserInputLabels |
所有映射到 Objective-C 物件的綁定物件的基底類別。 |
| ChangeIndexesKey |
代表與常數 'NSKeyValueChangeIndexesKey' 相關的值。 |
| ChangeKindKey |
代表與常數 'NSKeyValueChangeKindKey' 相關的值。 |
| ChangeNewKey |
代表與常數 'NSKeyValueChangeNewKey' 相關的值。 |
| ChangeNotificationIsPriorKey |
代表與常數 'NSKeyValueChangeNotificationIsPriorKey' 相關的值。 |
| ChangeOldKey |
代表與常數 'NSKeyValueChangeOldKey' 相關的值。 |
| Class |
所有映射到 Objective-C 物件的綁定物件的基底類別。 |
| ClassHandle |
Objective-C 類別是這個類別的處理方式。 |
| DebugDescription |
所有映射到 Objective-C 物件的綁定物件的基底類別。 |
| Description |
所有映射到 Objective-C 物件的綁定物件的基底類別。 |
| ExposedBindings |
所有映射到 Objective-C 物件的綁定物件的基底類別。 |
| Handle |
Handle(指標)指向未管理物件表示。 |
| IsDirectBinding |
取得或設定一個值,指示此實例是否使用直接 Objective-C 綁定。 |
| IsProxy |
所有映射到 Objective-C 物件的綁定物件的基底類別。 |
| RetainCount |
所有映射到 Objective-C 物件的綁定物件的基底類別。 |
| Self |
所有映射到 Objective-C 物件的綁定物件的基底類別。 |
| Superclass |
所有映射到 Objective-C 物件的綁定物件的基底類別。 |
| SuperHandle |
用 handle 表示此 NSObject基底類別中的方法。 |
| Zone |
所有映射到 Objective-C 物件的綁定物件的基底類別。 |