iOS-进阶题目

1. iOS面试题基础篇

2020-11-25  本文已影响0人  越天高

categoryextension 的区别

defineconst常量有什么区别?

blockweak修饰符的区别?

static关键字的作用

堆和栈的区别

风格纠错题

typedef NS_ENUM(NSInteger, CYLSex)

{

 CYLSexMan,

 CYLSexWoman

};

@interface  CYLUser : NSObject<NSCopying>

@property (nonatomic, copy, readonly) NSString *name;

@property (nonatomic, assign, readonly) NSUInteger age;

@property (nonatomic, assign, readwrite) CYLSex sex;

- (instancetype)initWithName:(NSString *)name age:(NSUInteger)age sex:(CYLSex)sex;

- (instancetype)initWithName:(NSString *)name age:(NSUInteger)age;

+ (instancetype)userWithName:(NSString *)name age:(NSUInteger)age sex:(CYLSex)sex;

@end

Objective-C使用什么机制管理对象内存?

ARC通过什么方式帮助开发者管理内存?

ARC是为了解决什么问题诞生的?

ARC下还会存在内存泄露吗?

什么情况使用weak关键字,相比assign有什么不同?

* weak 和 assign的不同点

@property 的本质是什么?

ivargettersetter是如何生成并添加到这个类中的?

@protocolcategory 中如何使用 @property

objc_setAssociatedObject

objc_getAssociatedObject

@property后面可以有哪些修饰符?

@property (nonatomic, getter=isOn) BOOL on;

// setter=这种不常用,也不推荐使用。故不在这里给出写法

使用atomic一定是线程安全的吗?

@synthesize@dynamic分别有什么作用

ARC下,不显式指定任何属性关键字时,默认的关键字都有哪些?

@synthesize合成实例变量的规则是什么?假如property名为foo,存在一个名为_foo的实例变量,那么还会自动合成新变量么?

在有了自动合成属性实例变量之后,@synthesize还有哪些使用场景?

怎么用 copy 关键字?

@property声明的NSString(或NSArrayNSDictionary)经常使用copy关键字,为什么?如果改用strong关键字,可能造成什么问题?

复制详解

这个写法会出什么问题:

@property (copy) NSMutableArray *array;

如何让自定义类可以用 copy 修饰符?如何重写带 copy 关键字的 setter

// 实现不可变版本拷贝

- (id)copyWithZone:(NSZone *)zone;

// 实现可变版本拷贝

- (id)mutableCopyWithZone:(NSZone *)zone;

// 重写带 copy 关键字的 setter

- (void)setName:(NSString *)name

{

 _name = [name copy];

}

+(void)load; +(void)initialize;有什么用处?

Foundation对象与Core Foundation对象有什么区别

addObserver:forKeyPath:options:context:各个参数的作用分别是什么,observer中需要实现哪个方法才能获得KVO回调?

/**

 1\. self.person:要监听的对象

 2\. 参数说明

 1> 观察者,负责处理监听事件的对象

 2> 要监听的属性

 3> 观察的选项(观察新、旧值,也可以都观察)

 4> 上下文,用于传递数据,可以利用上下文区分不同的监听

 */

[self.person addObserver:self forKeyPath:@"name" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context:@"Person Name"];

/**

* 当监控的某个属性的值改变了就会调用

 *

 * @param keyPath 监听的属性名

 * @param object 属性所属的对象

* @param change 属性的修改情况(属性原来的值、属性最新的值)

* @param context 传递的上下文数据,与监听的时候传递的一致,可以利用上下文区分不同的监听

 */

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context

{

 NSLog(@"%@对象的%@属性改变了:%@", object, keyPath, change);

}

KVO内部实现原理

• 补充:KVO的这套实现机制中苹果还偷偷重写了class方法,让我们误认为还是使用的当前类,从而达到隐藏生成的派生类

如何手动触发一个valueKVO

@property (nonatomic, strong) NSDate *now;

- (void)viewDidLoad

{

 [super viewDidLoad];

  // “手动触发self.now的KVO”,必写。

 [self willChangeValueForKey:@"now"];

  // “手动触发self.now的KVO”,必写。

 [self didChangeValueForKey:@"now"];

}

若一个类有实例变量NSString _foo,调用setValue:forKey:时,是以foo还是_foo作为key*?

KVCkeyPath中的集合运算符如何使用?

KVCKVOkeyPath一定是属性么?

如何关闭默认的KVO的默认实现,并进入自定义的KVO实现?

apple用什么方式实现对一个对象的KVO

上一篇下一篇

猜你喜欢

热点阅读