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 实例的托管表示形式。 指向非托管代码 Objective-C 对象的指针存储在 属性中 Handle 。
请务必注意,编译器目前不支持 NSObject 的泛型子类。
类注册
创建 NSObject 的子类时,此子类使用基于实现详细信息的完整 .NET 类型名称的名称注册到 Objective-C 运行时。 如果需要确保在 Objective-C 运行时中使用特定名称公开 C# 类,可以将 T:ObjCRuntime.RegisterAttribute 应用于该类,并指定希望类具有的名称。
在想要在某些 Objective-C 代码上按名称引用类、使用接口生成器 XIB 和情节提要文件时,或者使用 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# 中,这些方法应用了特殊的 T:ObjCRuntime.ExportAttribute 。 编译器使用此属性将 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# 方法,则需要将 T:ObjCRuntime.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);
}
}
生命周期
C# NSObject 及其子类是基础 Objective-C 对象的托管包装器。 它们是在使用“new”运算符创建新实例时,或者将现有非托管对象呈现到 C# 世界中时,从 C# 创建的。
使用“new”运算符从 C# 创建对象时,该对象最初由 C# 拥有,C# 将保留对对象的引用。 仅当垃圾回收器确定没有挂起的托管引用时,或者你手动调用对象上的 Dispose 方法时,才会删除此引用。
调用返回 NSObject 的方法或属性时,C# NSObject 也是按需创建的。 此时,运行时将检查对象缓存,并确定给定的 Objective-C NSObject 是否已呈现到托管世界。 如果对象已浮出水面,则将返回现有对象,否则将调用采用 IntPtr 作为参数的构造函数来构造对象。
与框架对象的纯“对等” (那些仅是 Objective-C 对象的 C# 表示形式且没有额外托管关联状态的对象,) 运行时可以使用前面提到的构造函数按需重新创建。
NSObjects 的用户子类通常包含 C# 状态,因此每当 Objective-C 运行时对这些对象之一执行“保留”操作时,运行时都将创建一个 GCHandle,使托管对象保持活动状态,即使没有对对象的 C# 可见引用也是如此。 这简化了预订,因为状态将自动保留。
对 NSObject 执行的 Dispose 操作将始终删除对基础 Objective-C 对象的引用,但不会销毁托管状态,仅当托管代码和非托管代码都释放了对象时,才会发生这种情况。 这与 .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# 方法直接访问它们。
若要向Key-Value编码系统公开 C# 属性,只需将 T:ObjCRuntime.ExportAttribute 添加到属性。 名称只能包含 ASCII 字符,以小写字母开头,并且不能包含任何空格。
public class CircleLayer : CALayer {
[Export ("radius")]
public double Radius { get; set; }
// ...
}
使用 M:Foundation.ValueForKey (Foundation.NSString) ;* 方法查找使用名称的属性,并使用函数 M:Foundation.SetValueForKey (Foundation.NSObject、 Foundation.NSString) ;*“ 方法设置指定属性的值。 例如,可以调用 foo。ValueForKey (“user”) 获取对象中用户属性的值。
此外,可以使用键路径让运行时为你重复调用 ValueForKey 或 SetValueForKey。 使用点分隔键。 例如,keypath“user.address.phone.mobile”将请求 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) |
创建非托管对象的托管表示形式时使用的构造函数;由运行时调用。 |
NSObject(IntPtr, Boolean) |
创建非托管对象的托管表示形式时使用的构造函数;由运行时调用。 |
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[]) |
设置适用于 |