|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 1、简述Object-C的理解与特性? |
| OC 作为一门 面向对象 的语言,自然具有面向对象的语言特性:封装、继承、多态。 它既具有 静态语言的特性(如C++),又有 动态语言的效率(动态绑定、动态加载等)。 |
| 总体来讲,OC确实是一门不错的编程语言,Objective-C 具有相当多的动态特性,表现为三方面: 动态类型(Dynamic typing)、动态绑定(Dynamic binding)和 动态加载(Dynamic loading)。 动态------必须到运行时(run time)才会做的一些事情。 |
| 动态类型:即运行时再决定对象的类型,这种动态特性在日常的应用中非常常见,简单来说就是id类型。 事实上,由于静态类型的固定性和可预知性,从而使用的更加广泛。 静态类型是强类型,而动态类型属于弱类型,运行时决定接受者。 |
| 动态绑定:基于动态类型,在某个实例对象被确定后,其类型便被确定了,该对象对应的属性和响应消息也被完全确定。 |
| 动态加载:根据需求加载所需要的资源,最基本就是不同机型的适配,例如,在Retina设备上加载@2x的图片,而在老一些的普通苹设备上加载原图,让程序在运行时添加代码模块以及其他资源,用户可根据需要加载一些可执行代码和资源,而不是在启动时就加载所有组件,可执行代码可以含有和程序运行时整合的新类 |
| |
| 2、Objective-C 中是否支持垃圾回收机制? |
| Objective-C 是支持垃圾回收机制的 (Garbage collection简称GC) , 但是apple的移动终端中 , 是不支持GC的,Mac桌面系统开发中是支持的. |
| 移动终端开发是支持ARC(Automatic Reference Counting的简称), ARC是在 IOS5 之后推出的新技术 , 它与GC的机制是不同的。 我们在编写代码时, 不需要向对象发送release或者autorelease方法, 也不可以调用delloc方法, 编译器会在合适的位置自动给用户生成release消息(autorelease), ARC 的特点是自动引用技术简化了内存管理的难度. |
| |
| 3、OC协议的基本概念和协议中方法默认为什么类型? |
| Objective-C中的协议是一个方法列表, 且多少有点相关。 它的特点是可以被任何类使用(实现), 但它并不是类(这里我们需要注意), 自身不会实现这样方法, 而是又其他人来实现协议经常用来实现委托对象(委托设计模式)。 如果一个类采用了一个协议, 那么它必须实现协议中必须需要实现的方法, 在协议中的方法默认是必须实现(@required), 添加关键字@optional, 表明一旦采用该协议, 这些"可选"的方法是可以选择不实现的。 |
| |
| 4、简述Objective-C中可修改和不可以修改类型? |
| Objective-C中可修改不可修改的集合类,就是可动态添加修改和不可动态添加修改。 比如NSArray和NSMutableArray, 前者在初始化后的内存控件就是固定不可变的,后者可以添加等,可以动态申请新的内存空间 |
| |
| 5、当我们调用一个静态方法时,需要对对象进行 release 吗? |
| 不需要, 静态方法 (类方法) 创建一个对象时, 对象已被放入自动释放池。 在自动释放池被释放时,很有可能被销毁 |
| |
| 6、当我们释放我们的对象时,为什么需要调用[super dealloc]方法,它的位置又是如何的呢? |
| 因为子类的某些实例是继承自父类的, 因此需要调用[super dealloc]方法, 来释放父类拥有的实例,其实也就是子类本身的。 一般来说我们优先释放子类拥 有的实例,最后释放父类所拥有的实例 |
| |
| 7、简述static、self、super关键字的作用? |
| 函数体内static变量的作用范围为该函数体,不同于auto变量,该变量的内存只被分配一次,因此其值在下次调用时仍维持上次的值. |
| 在模块内的 static 全局变量可以被模块内所用函数访问,但不能被模块外其它函数访问. |
| 在模块内的static函数只可被这一模块内的其它函数调用,这个函数的使用范围被限制在声明. |
| 在类中的static成员变量属于整个类所拥有,对类的所有对象只有一份拷贝. |
| self: 当前消息的接收者。 |
| super: 向父类发送消息 |
| |
| 8、 isMemberOfClass 和 isKindOfClass 联系与区别? |
| +isKindOfClass 类方法是从当前类的isa指向(也就是当前类的元类)开始。沿着superclass继承链查找判断和对比类是否相等。 |
| -isKindOfClass 对象方法从 [self class](当前类)开始,沿着superclass继承链查找判断和对比类是否相等。 |
| +is MemberOfClass 类方法直接判断当前类的isa指向(也就是当前类的元类)和对比类是否相等。 |
| -isMwemberOfClass 对象方法是直接判断[self class](当前类)和对比类是否相等。 |
| isKindOfClass和isMemberOfClass的区别 isKindOfClass来确定一个对象是否是一个类的实例,或者是该类祖先类的实例。 isMemberOfClass只能用来判断前者,不能用来判断后者。 isKindOfClass 能检测任何的类都是基于NSObject类这一事实,而isMemberOfClass却不可以。 |
| |
| 9、IOS Object-C对象可以被copy的条件? |
| 只有实现了NSCopying和NSMutableCopying协议的类的对象才能被拷贝, 分为不可变拷贝和可变拷贝,具体区别戳这; |
| NSCopying协议方法为: - (id) copyWithZone:(NSZone *)zone { MyObject *copy = [[[self class] allocWithZone: zone] init]; copy.username = [self.username copyWithZone:zone]; return copy; } |
| |
| 10、在某个方法中 self.name = _name,name = _name 它 们有区别吗,为什么? |
| 前者 (self.name = _name)是存在内存管理的setter方法赋值, 它会对_name对象进行保留或者拷贝操作 后者(name = _name)是普通赋值 。 |
| 一般来说,在对象的方法里成员变量和方法都是可以访问的,我们通常会重写Setter方法来执行某些额外的工作。 比如说,外部传一个模型过来,那么我会直接重写Setter方法,当模型传过来时,也就是意味着数据发生了变化,那么视图也需要更新显示,则在赋值新模型的同时也去刷新UI。 |
| |
IOS面试题object-c 1-10
️ 邪神2024-03-10 8:07
相关推荐
恋猫de小郭9 小时前
什么?Flutter 可能会被 SwiftUI/ArkUI 化?全新的 Flutter Roadmap网安墨雨13 小时前
iOS应用网络安全之HTTPS福大大架构师每日一题15 小时前
37.1 prometheus管理接口源码讲解BangRaJun1 天前
LNCollectionView-替换幂率流体刘小哈哈哈1 天前
iOS 多个输入框弹出键盘处理靴子学长1 天前
iOS + watchOS Tourism App(含源码可简单复现)一如初夏丿2 天前
xcode15 报错 does not contain ‘libarclite‘杨武博2 天前
ios 混合开发应用白屏问题BangRaJun2 天前
LNCollectionView二流小码农3 天前
鸿蒙元服务项目实战:终结篇之备忘录搜索功能实现