首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

iOS Objective C-是否应该从NSObject继承协调器和模型?

在iOS开发中,使用Objective-C时,是否应该从NSObject继承协调器(Coordinator)和模型(Model)取决于具体的设计需求和架构选择。

基础概念

NSObject

  • NSObject是Objective-C中的基类,提供了许多基本功能,如内存管理、消息传递、运行时类型信息等。

Coordinator

  • 协调器通常用于管理应用程序的导航流程和业务逻辑,是MVC(Model-View-Controller)或MVVM(Model-View-ViewModel)架构中的一个组件。

Model

  • 模型代表应用程序的数据和业务逻辑,通常负责数据的存储、处理和验证。

相关优势

  1. 继承自NSObject的优势
    • 可以利用Objective-C的运行时特性,如动态类型检查、方法交换等。
    • 获得NSObject提供的默认实现,如description方法,便于调试。
    • 方便使用KVC(Key-Value Coding)和KVO(Key-Value Observing)。
  • 不继承自NSObject的优势
    • 减少不必要的继承层次,使代码结构更简洁。
    • 可以自定义更轻量级的内存管理策略。

类型与应用场景

Coordinator

  • 如果协调器需要与Foundation框架中的其他类进行交互,或者需要利用Objective-C的运行时特性,继承自NSObject是有益的。
  • 在复杂的导航流程或需要跨多个视图控制器共享状态的应用中,继承自NSObject可以提供更多的灵活性和控制力。

Model

  • 对于简单的数据模型,可能不需要继承自NSObject,可以直接使用structclass定义。
  • 如果模型需要支持KVC/KVO,或者需要与Objective-C的其他部分紧密集成,继承自NSObject是合适的。

示例代码

继承自NSObject的Coordinator

代码语言:txt
复制
@interface AppCoordinator : NSObject

- (void)start;

@end

@implementation AppCoordinator

- (void)start {
    // 启动应用程序的逻辑
}

@end

不继承自NSObject的简单Model

代码语言:txt
复制
@interface UserModel {
    NSString *_name;
    NSInteger _age;
}

@property (nonatomic, copy) NSString *name;
@property (nonatomic) NSInteger age;

@end

@implementation UserModel

@synthesize name = _name;
@synthesize age = _age;

@end

遇到的问题及解决方法

问题:如果选择不继承自NSObject,可能会遇到无法使用KVC/KVO的问题。

解决方法

  • 如果确实需要KVC/KVO支持,那么继承自NSObject是必要的。
  • 如果可以避免使用KVC/KVO,可以通过自定义方法来实现数据的访问和修改。

总结

是否从NSObject继承协调器和模型应根据具体需求来决定。如果需要利用Objective-C的高级特性或与Foundation框架紧密集成,继承自NSObject是有益的。对于简单的模型,可以考虑不继承以简化代码结构。在设计时,应权衡这些因素以达到最佳实践。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

iOS学习——iOS 整体框架及类继承框架图

而类继承体系的了解有助于我们对iOS系统的整个模块的体系框架有一个更为清晰的了解和认识,对对应类继承体系中的类的特性和常规用法都有一个大致的认识和了解。...2.2 UIKit框架类继承体系   UIKitk框架提供一系列的Class(类)来建立和管理iOS应用程序的用户界面( UI )接口、应用程序对象、事件控制、绘图模型、窗口、视图和用于控制触摸屏等的接口...    Objective-C和Java C++一样,有封装,继承,多态,重用。...其它类继承NSObject,访问Objective-C运行时系统的基本接口,这样其他类的实例可以获得运行时的能力。 ?...respondsToSelector:方法用于测试接收者是否实现由选择器参数标识的方法。instancesRespondToSelector:类方法则用于测试给定类的实例是否实现指定的方法。

3.6K70

iOS中Cocoa框架·Runtime及isa指针知识·填坑

Cocoa框架是iOS应用程序的基础,了解Cocoa框架,对开发iOS应用有很大的帮助。 1、Cocoa是什么? Cocoa是OS X和 iOS操作系统的程序的运行环境。...通知 归档和序列化 表达式和条件判断 Objective-C语言服务 1.3 UIKit框架 应用程序可以通过三种方式使用UIKit创建界面 在用户界面工具(interface Buidler)从对象库里...2、Cocoa对象 2.1 Objective-C是面向对象的语言 Objective-C和Java C++一样,有封装,继承,多态,重用。...其它类继承NSObject,访问Objective-C运行时系统的基本接口,这样其他类的实例可以获得运行时的能力。 ?...isSubclassOfClass:类方法则用于测试类的继承性。 respondsToSelector:方法用于测试接收者是否实现由选择器参数标识的方法。

1K20
  • 类的本质-类对象

    引用《Effective Objective-C 2.0 编写高质量iOS与OS X代码的52个有效方法》中的一段话:superclass指针确定了继承关系,而isa指针描述了实例所属的类。...在实现中,Root Class是指 NSObject,我们可以从图中看出: NSObject类对象包括它的对象实例方法。 NSObject的元对象包括它的类方法,例如new方法。...若是如此,那就应该使用==操作符,而不要使用比较Objective-C对象使常用的“isEqual:”方法。因为==操作符比较的是指针是否相等,也就是比较内存地址是否相同。...而"isEqual:"比较的是两个Objective-C对象的值是否相等。...下面笔者引用《Effective Objective-C 2.0 编写高质量iOS与OS X代码的52个有效方法》中的一段话来进行解释: 虽然使用"class方法"也可以查询对象的类型信息。

    9.3K50

    RunTime 之使用前须知

    在实现中,Root Class 是指 NSObject,我们可以从图中看出: 1. NSObject 类包括它的对象实例方法。 2....详情可看:iOS编译过程的原理和应用 编译器前端(Objective C采用Clang作为前端,而Swift则采用swift()作为前端) 编译器前端的任务是进行:语法分析,语义分析...iOS的编译过程,后端的处理如下 (1)LVVM优化器会进行BitCode的生成,链接期优化等等。...我们可以通过NSObject的一些方法获取运行时信息或动态执行一些消息: class 返回对象的类; isKindOfClass 和 isMemberOfClass检查对象是否在指定的类继承体系中...---- 参考文章: 深入Objective-C的动态特性 关于CLASS , SEL, IMP的说明 唐巧-Objective-C对象模型及应用

    73420

    27.Swift学习之与OC混编

    在目前iOS开发语言从Objective-C到Swift的过渡时期,开发中难免会碰到两种语言同时存在的情况,如果在同一个项目中,两种语言并存,那么该项目就是一个混合项目。...一、Objective-C的项目中调用Swift 新建一个Objective-C的iOS项目 创建一个Swift的类,继承自NSObject,这时候会有如下的提示,此时选择Create Bridging...混合项目提示信息.png 这短话的大意:添加这个文件会创建一个Objective-C和Swift的混合项目,你是否希望Xcode自动配置一个桥接头文件来让两种语言的类文件相互可见?...Header文件,该头文件是自动生成的并且对开发者透明 在Swift代码中将需要暴露给OC调用的属性和方法前加上 @objc修饰符,关于这个内容可查看之前的博文 class Person: NSObject...新建一个Swift的iOS项目 创建一个Objective-C的类,此时也会有如一中的文字提示,修改类文件如下: @interface Person : NSObject -(void)eat; @end

    1.2K10

    iOS开发之 Method Swizzling 深入浅出

    以后有新人加入之后,都要嘱咐其继承自这个基类,所以这种方式并不可取。 Category 我们可以为UIViewController建一个Category,然后在所有控制器中引入这个Category。...Selector由编译器产生并且在当类被加载进内存时由运行时自动进行名字和实现的映射。...NSObject 需要 Swizzle 的方法必须有动态属性(dynamic attribute) 注:对于 Swift 的自定义类,因为默认并没有使用 Objective-C 运行时,因此也没有动态派发的方法列表...当然类也要继承自 NSObject。...再注:下面这个例子使用了 Objective-C 的动态派发,对于 NSObject 的子类(UIViewController)是可以直接使用的,并不是 Swift 中自定义的类,因此没有加 dynamic

    2.4K70

    iOS开发入门笔记

    Xcode 和 模拟器 Xcode可以在苹果官网免费下载:Xcode下载地址 安装Xcode时会自动安装iOS SDK和模拟器。 这么强大的IDE居然是免费的,还是挺让人开心的。...Objective-C Objective-C是苹果应用软件(包括苹果电脑上的Mac OS App和移动设备上的iOS App)的开发语言。它是一种面向对象的编程语言。...看起来是不是和继承没太多差别呢(除了使用的时候实例化的是NSObject,而不是JsonObject)?...再看一个继承实现不了的例子: 头文件:NSObject+Json+XML.h @interface NSObject (Json) -(NSString)toJson; @end @interface...咱们天朝的版图,都是北纬和东经。 摄像头 Mac电脑有摄像头,但Mac OS没有设计API给iOS模拟器调用,所以,不能用模拟器测试对焦闪光灯等功能。

    4K60

    iOS系统架构及常用框架

    布局 masonry 7 系统框架重点解析 UIKit UIKit框架是可视类对象的基础文件,继承于NSObject。...提供一系列的Class(类)来建立和管理iPhone OS应用程序的用户界面接口、应用程序对象、事件控制、绘图模型、窗口、视图和用于控制触摸屏等的接口。...Foundation框架 所有的Mac OS X和IOS程序都是由大量的对象构成,而这些对象的根对象绝大多数是NSObject,NSObject就处在Foundation框架之中,也可理解为Foundation...通常我们会将他们分为几类: 值对象 集合 操作系统服务:文件系统、URL、进程通讯 通知 归档和序列化 表达式和条件判断 Objective-C语言服务 NSObject Objective-C 中 NSObject...cache:因为Objective-C的消息转发需要查找dispatch table甚至可能需要遍历继承体系,所以缓存最近使用的方法。 protocols:类需要遵守的协议。

    7.9K21

    runtime的那些事(一)——runtime基础介绍

    这意味着 Objective-C 语言不仅需要编译器,还需要 runtime 来执行编译代码。...两个版本最典型的区别,就是 Modern 版本中若更改类中实例变量的布局,则不必重新编译继承自该类的类。对于 iOS 开发者来说,我们只需要关注 Modern 版本即现行版本的runtime 即可。...Foundation 框架下 NSObject 类的方法 在 iOS 类体系中,绝大部分Objective-C 类继承根类是 NSObject 类(NSProxy类除外,NSProxy定位更适合作为消息转发的代理抽象类...runtime 消息打印 图中 testClass 类继承自 NSObject 类,其中 walks 方法只在头文件中进行了声明,但未实现 IMP。...消息转发小扩展——实现Objective-C 多继承 利用消息转发可以实现 Objective-C 语言编程的多继承效果。

    1.6K20

    干货 | 携程机票 App KMM 跨端生产实践

    并且 JavaScript 或 Dart 与原生开发语言(Java/Kotlin、Objective-C/Swift)之间的交互需要通过“桥接通讯”实现,导致每当需要系统框架层面的改动支持时,必须双方模块架构上共同协调处理...这个问题是否解决将决定 KMM 能否用于生产环境,经过我们的研究和评估后制定了一系列的解决方案。...代码,而 NSObject 是所有 Objective-C 类的根级超类,看起来所有 Kotlin 类也应该都是 NSObject 的子类,但到了 Kotlin 工程中,奇怪的事情就发生了,Any 类与...Kotlin 类继承自NSObject)都无法通过编译,但是在 Xcode 工程中却可以。...在探索 KMM 的过程中,我们切实感受到了 Kotlin 与原生语言交互能力的提升,从 Kotlin 的泛型支持映射到 Objective-C,再到 Objective-C/Swift 可以调用 Kotlin

    3.7K10

    iOS开发·runtime原理与实践: 消息转发篇(Message Forwarding) (消息机制,方法未实现+API不兼容奔溃,模拟多继承)

    如果cache中没有找到就找类的方法列表中是否有对应的方法。 如果类的方法列表中找不到就到父类的方法列表中查找,一直找到NSObject类为止。...cmd,所以我们要配置其他参数时是从第三个参数开始配置 消息转发 3.2.3 验证对比新方案 注意测试的时候,选择iOS10系统的模拟器进行验证(没有的话可以先Download Simulators),...总结 4.1 模拟多继承 面试挖坑:OC是否支持多继承?好,你说不支持多继承,那你有没有模拟多继承特性的办法?...转发和继承相似,可用于为OC编程添加一些多继承的效果,一个对象把消息转发出去,就好像他把另一个对象中放法接过来或者“继承”一样。...虽然转发可以实现继承功能,但是NSObject还是必须表面上很严谨,像respondsToSelector:和isKindOfClass:这类方法只会考虑继承体系,不会考虑转发链。

    2.1K11

    Objective-C Runtime编程指南(1)

    苹果官方文档Objective-C Runtime Programming Guide 一、简介 Objective-C语言从编译时和链接时到运行时,推迟了尽可能多的决策。...您只需编写和编译Objective-C源代码即可使用它。 编译包含Objective-C类和方法的代码时,编译器将创建实现该语言动态特性的数据结构和函数调用。...数据结构捕获类和类别定义以及协议声明中的信息; 它们包括Objective-C编程语言中定义类和协议以及方法选择器,实例变量模板和从源代码中提取的其他信息中讨论的类和协议对象。...转发消息的对象因此从继承层次的两个分支(它自己的分支)和响应该消息的对象的分支“继承”方法。在上面的例子中,看起来好像Warrior类继承了Diplomat以及它自己的超类。...所有更大的对象的消息都通过代理,所以就程序其余部分而言,代理和更大的对象将是相同的。 转发和继承 虽然转发模仿继承,NSObject类永远不会混淆两者。

    82120

    iOS面试现场,笔试提高题详解

    代理的实现流程 在iOS中代的本质就是代理对象内存的传递和操作,我们在委托类设置代理对象后,实际上只是一个id类型的指针将代理对象进了一个弱引。...代理与其他iOS中消息传递的式的对 通知:在iOS中由通知中进消息接收和消息播,是种对多的消息传递式。 代理:是种通的设计模式,iOS中对代理持的很好,由代理对象、委托者、协议三部分组成。...从设计模式的角度来说,代理更加面向过程,block更加向结果。 5.从性能上来说,block的性能消耗要略大于delegate,因为block会涉及到栈区向堆区拷等操作,时间和空间上的消耗都于代理。...假设C类要同时继承A类和B类,则称之为多继承。这种情况就是多继承。...最简单和常用的就是, 我们用户的登录信息, 不做本地缓存的话, 我们登录成功之后, 把服务器请求下来的用户信息保存到单例中。

    81720

    KMM 求生日记二:KotlinNative 被踩中的坑

    在 Android 上完成基本的测试,能跑通之后,由我的一位同事(也是小组 leader)在 iOS 主工程中编写类似我在 Android 主工程中编写的代码(Objective-C)。...但是到了 Kotlin 工程中情况就变的完全不同了,所有 Kotlin 类继承自 Any,而 Any 和 NSObject 之间没有任何类型关系。...但奇怪的是,在 Kotlin 工程中如果直接声明一个类继承自 NSObject,可以用 class() 函数来获取自身的 class 对象,但普通的 Kotlin 类则没有这个函数。...结语 KMM 代码发布上线在即,如果它能在线上稳定跑一到两个版本(主要担心的就是 iOS 平台),就至少可以说明 Kotlin/Native 的编译器、 runtime 以及标准库没有太大问题,当然...如果能用 cinterop 搞定对已有的 iOS Framework 或 .a 文件的依赖,我们可以基于许多已有的 Objective-C 库和 Java 库封装出许多实用的 KMM 库,而暂时不必用

    2.7K10

    16道面试官必问你必须会的iOS面试题

    从栈中取出元素,看是否遍历到了结尾,如果是的话,则出栈。 判断第 2 步是否使栈为空,如果为空,则返回 nil。 终于拿到元素了,这一步判断拿到的元素是否是数组。...从栈中取出元素,看是否遍历到了结尾,如果是的话,则出栈。...所以,为了保证父类的类方法可以在子类中可以被调用,所以子类的元类会继承父类的元类,换而言之,类对象和元类对象有着同样的继承关系。...下面这张图或许能够让大家对 isa 和继承的关系清楚一些: [1240] 我们可以从图中看出: NSObject 的类中定义了实例方法,例如 -(id)init 方法 和 - (void)dealloc...NSObject 的元类继承自 NSObject 类,所以 NSObject 类是所有类的根,因此 NSObject 中定义的实例方法可以被所有对象调用,例如 - (id)init 方法 和 - (void

    2.7K50

    深入浅出iOS内存管理-技术创作101训练营

    如果一个对象的引用计数器为0,则系统就会自动调用这个对象的dealloc方法来销毁这个对象。 在代码中,一般使用dealloc方法来查看一个对象是否被回收,如果没有被回收,则有可能会造成内存泄露。...简答(ARC 强/弱引用) 我是15年开始入坑iOS开发的,从Xcode 5学起,当时大多数项目还都是MRC项目,其中最有名的还数ASIHTTPRequest库,MRC下需要手动进行引用计数管理,不乏就要写大量的...对象内存 并且也有一些比较新颖的面试题出现: 面试题(NSObject 对象原理) 一个Objective-C对象如何进行内存布局?...在将分配集设置isa到对象的类之后,该对象将集成到继承层次结构的运行时视图和构成程序的当前对象网络(类和实例)中。...初始化对象的 isa实例变量指向对象的类,它是一个从类定义编译的运行时对象。 初始化所有其他 实例变量为零(或等效类型为零,如nil,NULL和0.0)。

    1.3K54
    领券