You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何判断自定义类是否为可变类?系统类可通过名称识别

如何判断自定义类是否为可变类?

嘿,这个问题问得好!在Foundation框架里我们靠类名和继承关系就能轻松区分NSArray和NSMutableArray,但自定义类的可变/不可变判断就得靠我们自己设计的规则了,下面给你几个实用的方法:

方法1:检查类继承关系

通常我们会模仿Foundation的设计模式——让不可变类作为基类,可变类继承自它。这种情况下,直接通过类对象判断就很靠谱:

// 假设你的不可变基类是MyClass,可变子类是MyMutableClass
id customObject = ...;
if ([customObject isKindOfClass:[MyMutableClass class]]) {
    NSLog(@"这是可变类的实例");
} else if ([customObject isKindOfClass:[MyClass class]]) {
    NSLog(@"这是不可变类的实例");
}

如果你的类体系有多层继承,isKindOfClass:会自动匹配父类,比直接用==比较类对象更灵活。

方法2:验证可变特有的方法实现

可变类的核心特征是能修改内部状态,所以它必然会暴露一些不可变类没有的修改方法(比如类似NSMutableArray的addObject:)。我们可以用respondsToSelector:来检查这些特有方法:

// 假设你的可变类有setName:、addItem:这类修改方法
if ([customObject respondsToSelector:@selector(setName:)] && 
    [customObject respondsToSelector:@selector(addItem:)]) {
    NSLog(@"这个实例属于可变类");
}

⚠️ 注意:尽量检查一组方法而不是单个,避免不可变类偶然实现某个同名方法导致误判。

方法3:给类添加明确的可变标识

这是最可靠的方案——直接在类里定义一个专属的判断方法或属性,主动标记是否为可变类:

首先在不可变基类MyClass中添加:

+ (BOOL)isMutable {
    return NO;
}

然后在可变子类MyMutableClass中重写这个方法:

+ (BOOL)isMutable {
    return YES;
}

之后判断就变得非常直观:

if ([customObject.class isMutable]) {
    NSLog(@"这是可变类");
} else {
    NSLog(@"这是不可变类");
}

这种方式完全不会有歧义,尤其是在复杂的类继承体系里,比前两种方法更健壮。

内容的提问来源于stack exchange,提问作者无夜之星辰

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 04:04:51