iOS中的基类与根类是什么?NSObject的定义及应用方法咨询
嘿,我来帮你把iOS里的基类、根类以及NSObject的相关内容讲明白~
iOS中的基类与根类
首先得区分这两个概念:
- 根类:是整个类继承体系的最顶端,没有父类的类。iOS里最核心的根类就是
NSObject,另外还有一个NSProxy(主要用于消息转发场景,日常开发用得少)。几乎所有Objective-C的类,以及需要和OC交互的Swift类,最终都继承自NSObject。 - 基类:一般指某个特定类家族的顶层父类,比如UIKit里的
UIResponder是所有响应者类(UIView、UIViewController等)的基类,但UIResponder本身还是继承自NSObject。所以可以说,NSObject是所有OC类的“终极基类”。
NSObject的定义
NSObject是Objective-C的核心类,它定义了对象最基础的行为和属性,比如:
- 每个
NSObject对象都有一个isa指针,指向它的类对象,这是OC实现面向对象的核心。 - 提供了内存管理相关的方法(虽然现在ARC自动处理,但底层还是依赖这些方法)。
- 定义了对象相等性判断(
isEqual:、hash)、对象描述(description)、初始化(init)等核心方法。
它的简化OC定义大概是这样:
@interface NSObject <NSObject> { Class isa; } + (void)load; + (void)initialize; - (instancetype)init; - (BOOL)isEqual:(id)object; - (NSUInteger)hash; - (NSString *)description; // 还有更多底层方法,比如retain、release、performSelector:等 @end
在Swift里,原生类默认不继承NSObject,但如果要和OC代码交互,或者使用OC框架的特性,就需要让Swift类继承它,这样Swift类会被桥接成OC兼容的对象。
如何在应用中使用NSObject
1. 作为自定义类的父类
日常开发中,我们创建的模型类、工具类几乎都会继承NSObject,这样能直接复用它提供的所有基础能力,不用自己从零实现。比如创建一个用户模型:
// User.h @interface User : NSObject @property (nonatomic, copy) NSString *name; @property (nonatomic, assign) NSInteger age; @end // User.m @implementation User // 重写isEqual:来判断两个User对象是否相等 - (BOOL)isEqual:(id)object { if (self == object) return YES; if (![object isKindOfClass:[User class]]) return NO; User *otherUser = (User *)object; return [self.name isEqualToString:otherUser.name] && self.age == otherUser.age; } // 重写hash,和isEqual:保持一致 - (NSUInteger)hash { return [self.name hash] ^ self.age; } // 重写description,打印对象时显示更友好的信息 - (NSString *)description { return [NSString stringWithFormat:@"User{name: %@, age: %ld}", self.name, (long)self.age]; } @end
使用的时候:
User *user = [[User alloc] init]; user.name = @"Alice"; user.age = 25; NSLog(@"%@", user); // 会输出:User{name: Alice, age: 25}
2. 利用NSObject的工具方法
NSObject提供了很多实用的工具方法,帮我们处理动态类型、方法调用等场景:
// 判断对象类型 if ([user isKindOfClass:[User class]]) { NSLog(@"这是一个User对象"); } // 检查对象是否能响应某个方法 if ([user respondsToSelector:@selector(setName:)]) { // 动态调用方法 [user performSelector:@selector(setName:) withObject:@"Bob"]; }
3. Swift中与OC交互
如果你的Swift类需要被OC代码调用,或者要使用OC的一些特性(比如KVO、动态方法调用),就需要让它继承NSObject,并且加上@objc或@objcMembers标记:
@objcMembers class Product: NSObject { var productID: Int var productName: String init(id: Int, name: String) { self.productID = id self.productName = name super.init() } }
这样OC代码就能通过导入自动生成的头文件来使用这个Product类了。
内容的提问来源于stack exchange,提问作者Creative Study
相关产品推荐
相关产品推荐

