0
点赞
收藏
分享

微信扫一扫

IOS面试题object-c 41-50

小时候是个乖乖 03-10 10:30 阅读 3
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 ... 之类的对象),接收到copymutableCopy消息时,都遵循以下准则:
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 意思是,除非开发人员已经做了,否则由编译器生成相应的代码,以满足属性声明。

🚀🚀🚀🚀🚀🚀
举报

相关推荐

0 条评论