不明觉厉iOSiOSiOS学习笔记

iOS知识基础篇

2015-10-13  本文已影响5786人  Andyzhao

category 和 extension 的区别

define 和 const常量有什么区别?

__block和__weak修饰符的区别?

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有什么不同?

@property 的本质是什么?

ivar、getter、setter是如何生成并添加到这个类中的?

@protocol 和 category 中如何使用 @property

objc_setAssociatedObject
objc_getAssociatedObject

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

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

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

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

@synthesize 和 @dynamic分别有什么作用

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

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

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

怎么用 copy 关键字?

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

复制详解

[不可变对象 copy] // 浅复制
[不可变对象 mutableCopy] //深复制
[可变对象 copy] //深复制
[可变对象 mutableCopy] //深复制
[不可变对象 copy] // 浅复制
[不可变对象 mutableCopy] //单层深复制
[可变对象 copy] //单层深复制
[可变对象 mutableCopy] //单层深复制

这个写法会出什么问题: @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内部实现原理

如何手动触发一个value的KVO

@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?

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

KVC和KVO的keyPath一定是属性么?

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

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

上一篇下一篇

猜你喜欢

热点阅读