如何判断自定义类是否为可变类?系统类可通过名称识别
如何判断自定义类是否为可变类?
嘿,这个问题问得好!在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,提问作者无夜之星辰
相关产品推荐
相关产品推荐

