IOS面试题object-c 41-50

|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 41、#import跟 #include 有什么区别,@class呢,#import<> 跟 #import""有什么区别? |
| 1). #import 是Objective-C导入头文件的关键字,#include 是C/C++导入头文件的关键字,使用 #import 头文件会自动只导入一次,不会重复导入。 |
| 2). @class 告诉编译器某个类的声明,当执行时,才去查看类的实现文件,可以解决头文件的相互包含。 |
| 3). #import<> 用来包含系统的头文件,#import"" 用来包含用户头文件。 |
| 🚀🚀🚀🚀🚀🚀 |
| 42、解释Object-C frame 和 bounds 的异同 ? |
| 1、frame不管对于位置还是大小,改变的都是自己本身 |
| 2、frame的位置是以父视图的坐标系为参照,从而确定当前视图在父视图中的位置 |
| 3、frame的大小改变时,当前视图的左上角位置不会发生改变,只是大小发生改变 |
| 4、bounds改变位置时,改变的是子视图的位置,自身没有影响; 其实就是改变了本身的坐标系原点,默认本身坐标系的原点是左上角(0,0)。 比如origins改为(0,100),那么左上角坐标变成了(0,100), 子视图的坐标就要相对于(0,100)布局。 |
| 5、bounds的大小改变时,当前视图的中心点不会发生改变,当前视图的大小发生改变,看起来效果就想缩放一样 |
| 🚀🚀🚀🚀🚀🚀 |
| 43、 Objective-C的类可以多重继承么?可以实现多个接口么? |
| Object-c的类没有多继承, 只支持单继承, 如果要实现多继承的话, 可以通过类别和协议的方式来实现, OC类似于多继承,是在 用protocol委托代理来实现的; 可以实现多个接口,通过实现多个接口可以完成C++的多重继承; |
| Category 是类别, 一般情况用分类好, 用Category去重写类的方法, 仅对本Category有效, 不会影响到其他类与原有类的关系。 |
| 🚀🚀🚀🚀🚀🚀 |
| 44、 Object-C @property 的本质描述 ? |
| @property 的本质是什么? @property = ivar + getter + setter; "属性" (property)有两大概念:ivar(实例变量)、getter+setter(存取方法) |
| "属性" (property)作为 Objective-C 的一项特性,主要的作用就在于封装对象中的数据。 Objective-C 对象通常会把其所需要的数据保存为各种实例变量。 实例变量一般通过"存取方法"(access method)来访问。 其中,"获取方法" (getter)用于读取变量值,而"设置方法" (setter)用于写入变量值 |
| 🚀🚀🚀🚀🚀🚀 |
| 45、Object-C @property中有哪些属性关键字? |
| 属性可以拥有的特质分为四类: 1.原子性--- nonatomic 特质 2.读/写权限---readwrite(读写)、readonly (只读) 3.内存管理语义---assign、strong、 weak、unsafe_unretained、copy 4.方法名---getter= 、setter= 5.不常用的:nonnull,null_resettable,nullable |
| 🚀🚀🚀🚀🚀🚀 |
| 46、属性关键字 readwrite,readonly,assign,retain,copy,nonatomic 作用简述 ? |
| 1). readwrite 是可读可写特性。需要生成getter方法和setter方法。 2). readonly 是只读特性。只会生成getter方法,不会生成setter方法,不希望属性在类外改变。 3). assign 是赋值特性。setter方法将传入参数赋值给实例变量;仅设置变量时,assign用于基本数据类型。 4). retain(MRC)/strong(ARC) 表示持有特性。setter方法将传入参数先保留,再赋值,传入参数的retaincount会+1。 5). copy 表示拷贝特性。setter方法将传入对象复制一份,需要完全一份新的变量时。 6). nonatomic 非原子操作。决定编译器生成的setter和getter方法是否是原子操作,atomic表示多线程安全,一般使用nonatomic,效率高 |
| 🚀🚀🚀🚀🚀🚀 |
| 47、简述 系统对象的 copy 与 mutableCopy 方法? |
| 不管是集合类对象(NSArray、NSDictionary、NSSet ... 之类的对象),还是非集合类对象(NSString, NSNumber ... 之类的对象),接收到copy和mutableCopy消息时,都遵循以下准则: 1. copy 返回的是不可变对象(immutableObject);如果用copy返回值调用mutable对象的方法就会crash。 2. mutableCopy 返回的是可变对象(mutableObject)。 |
| 一、非集合类对象的copy与mutableCopy 在非集合类对象中,对不可变对象进行copy操作,是指针复制,mutableCopy操作是内容复制; 对可变对象进行copy和mutableCopy都是内容复制。用代码简单表示如下: NSString *str = @"hello word!"; NSString *strCopy = [str copy] // 指针复制,strCopy与str的地址一样 NSMutableString *strMCopy = [str mutableCopy] // 内容复制,strMCopy与str的地址不一样 NSMutableString *mutableStr = [NSMutableString stringWithString: @"hello word!"]; NSString *strCopy = [mutableStr copy] // 内容复制 NSMutableString *strMCopy = [mutableStr mutableCopy] // 内容复制 |
| 二、集合类对象的copy与mutableCopy (同上) 在集合类对象中,对不可变对象进行copy操作,是指针复制,mutableCopy操作是内容复制; 对可变对象进行copy和mutableCopy都是内容复制。 但是:集合对象的内容复制仅限于对象本身,对集合内的对象元素仍然是指针复制。(即单层内容复制) NSArray *arr = @[@[@"a", @"b"], @[@"c", @"d"]; NSArray *copyArr = [arr copy]; // 指针复制 NSMutableArray *mCopyArr = [arr mutableCopy]; //单层内容复制 NSMutableArray *array = [NSMutableArray arrayWithObjects:[NSMutableString stringWithString:@"a"],@"b",@"c",nil]; NSArray *copyArr = [mutableArr copy]; // 单层内容复制 NSMutableArray *mCopyArr = [mutableArr mutableCopy]; // 单层内容复制 |
| 🚀🚀🚀🚀🚀🚀 |
| 48、简述代码问题:@property (nonatomic, copy) NSMutableArray *arr; |
| 添加, 删除, 修改数组内的元素的时候, 程序会因为找不到对应的方法而崩溃。 //如:-[__NSArrayI removeObjectAtIndex:]: unrecognized selector sent to instance 0x7fcd1bc30460 // copy后返回的是不可变对象(即 arr 是 NSArray 类型,NSArray 类型对象不能调用 NSMutableArray 类型对象的方法) 原因:是因为 copy 就是复制一个不可变 NSArray 的对象,不能对 NSArray 对象进行添加/修改 |
| 🚀🚀🚀🚀🚀🚀 |
| 49、写Setter 方法用于完成 @property (nonatomic, retain) NSString *name, 写一个 setter 方法用于完成 @property (nonatomic, copy) NSString *name |
| // retain - (void)setName:(NSString *)str { [str retain]; [_name release]; _name = str; } // copy - (void)setName:(NSString *)str { id t = [str copy]; [_name release]; _name = t; } |
| 🚀🚀🚀🚀🚀🚀 |
| 50、阐述@synthesize 和 @dynamic 作用? |
| @synthesize 是系统自动生成getter和setter属性声明 @dynamic 是开发者自已提供相应的属性声明 @dynamic 意思是由开发人员提供相应的代码:对于只读属性需要提供 setter,对于读写属性需要提供 setter 和 getter。 @synthesize 意思是,除非开发人员已经做了,否则由编译器生成相应的代码,以满足属性声明。 @dynamic 意思是由开发人员提供相应的代码:对于只读属性需要提供 setter,对于读写属性需要提供 setter 和 getter。 @synthesize 意思是,除非开发人员已经做了,否则由编译器生成相应的代码,以满足属性声明。 |
| 🚀🚀🚀🚀🚀🚀 |

相关推荐
crasowas8 小时前
iOS - 超好用的隐私清单修复脚本(持续更新)
ios·app store
ii_best10 小时前
ios按键精灵脚本开发:ios悬浮窗命令
ios
Code&Ocean15 小时前
iOS从Matter的设备认证证书中获取VID和PID
ios·matter·chip
/**书香门第*/15 小时前
Laya ios接入goole广告,开始接入 2
ios
恋猫de小郭1 天前
什么?Flutter 可能会被 SwiftUI/ArkUI 化?全新的 Flutter Roadmap
flutter·ios·swiftui
网安墨雨1 天前
iOS应用网络安全之HTTPS
web安全·ios·https
福大大架构师每日一题2 天前
37.1 prometheus管理接口源码讲解
ios·iphone·prometheus
BangRaJun2 天前
LNCollectionView-替换幂率流体
算法·ios·设计
刘小哈哈哈2 天前
iOS 多个输入框弹出键盘处理
macos·ios·cocoa
靴子学长2 天前
iOS + watchOS Tourism App(含源码可简单复现)
mysql·ios·swiftui