标签:write ons 生成 自定义 bullet 个人 跳过 nsstring 属性
考察一个面试者基础咋样,基本上问一个 @property 就够了:
runtime 对注册的类, 会进行布局,对于 weak 对象会放入一个 hash 表中。 用 weak 指向的对象地址作为 key,当此对象的引用计数为0的时候会 dealloc, 进而在这个 weak 表中找到此对象地址为键的所有 weak 对象,从而设置为 nil
每个人擅长的领域不一样,我们一般会从简历上找自己写擅长的技术聊,假如自己并不是很熟,最好别写出来或扯出来,万一面试官刚好非常精通这里就露馅了。
总结过些面试题,没坚持下去,后来把这些当 checklist,面试的时候实在没话聊的时候做个提醒,语言、框架、运行机制性质的:
同上
不需要,在ARC环境无论是强指针还是弱指针都无需在deallco设置为nil,ARC会自动帮我们处理
如果没有指定成员变量的名称与自动生成一个属性同名的成员变量,如果指定的成员变量的名称,会生成一个指定的名称的成员变量,如果这个成员已经存在了就不再生成了.
如果是 @synthesize foo; 还会生成一个名称为foo的成员变量
如果是 @synthesize foo = _foo; 就不会生成成员变量了.
@synthesize主要就是用来生成setter,getter方法的实现,在@property被增强之后,其实已经很少使用@synthesize了,你知道@synthesize的其他使用场景吗? 能给我介绍一下吗?
如果你听懂了,感觉面试官说的很有道理,可以说点赞美的话.
该方法编译之后就是objc_msgSend()函数调用.如果我没有记错的大概是这样的.
((void ()(id, SEL))(void )objc_msgSend)((id)obj, sel_registerName("foo"));
[※※※※]下面的代码输出什么?
@implementation Son : Father
- (id)init
{
self = [super init];
if (self) {
NSLog(@"%@", NSStringFromClass([self class]));
NSLog(@"%@", NSStringFromClass([super class]));
}
return self;
}
@end
输出的结果都是:Son,
原因:super 和 self 都是指向的本实例对象的,
不同的是,super调用的跳过本类方法,调用父类的方法
父类方法的class方法本来都是在基类中实现的,所以无论使用self和super调用都是一样的.
具体分析参照刨根问底Objective-C Runtime(1)- Self & Super
[※※※※※]objc中的类方法和实例方法有什么本质区别和联系?
1. 没有研究过,你有研究过吗,可以给我讲讲吗?
2. 我猜系统会维护一个弱指针列表,当某个对象销毁时候,它会把所有指向该对象的弱指针设置为nil
因为编译后的类已经注册在 runtime 中,类结构体中的 objc_ivar_list 实例变量的链表 和 instance_size 实例变量的内存大小已经确定,同时runtime 会调用 class_setIvarLayout 或 class_setWeakIvarLayout 来处理 strong weak 引用。所以不能向存在的类中添加实例变量,
运行时创建的类是可以添加实例变量,调用 class_addIvar 函数。但是得在调用 objc_allocateClassPair 之后,objc_registerClassPair 之前,原因同上。
1. 每一个线程中都一个runloop,只有主线的的runloop默认是开启的,其他线程的runloop是默认没有开启的
2. 可以通过CFRunLoopRun() 函数来开启一个事件循环
3. 看SDWebImage源码的时候见到有这么用过.
model 主要是用来指定时间在运行循环中的优先级的
苹果公开提供的 Mode 有两个:
kCFRunLoopDefaultMode
kCFRunLoopCommonModes
如果我们把一个NSTimer对象以kCFRunLoopDefaultMode添加到主运行循环中的时候,当一直有用户事件处理的时候,NSTimer将不再被调度
如果我们把一个NSTimer对象以kCFRunLoopCommonModes添加到主运行循环中的时候,当一直有用户事件处理的时候,NSTimer还能正常的调度,互不影响.
同上
1. 他是一个死循环
2.如果事件队列中存放在事件,那就取出事件,执行相关代码
3.如果没有事件,就挂起,等有事件了,立即唤醒事件循环,开始执行.
简单来说。。。
function loop() {
initialize();
do {
var message = get_next_message();
process_message(message);
} while (message != quit);
}
* MRC 手动引用计数
* ARC 自动引用计数,现在通常使用自动引用计数
通过编译器在编译的时候,插入如内管理的代码
在每次事件循环开始创建自动释放池,在每次事件结束销毁自动释放池
以viewDidLoad方法为例,可以理解为在viewDidLoad方法开始执行之前创建自动释放池,
在viewDidLoad方法执行之后销毁自动释放吃
1. 死循环了
2. 访问一个僵尸对象
1. 我猜想autoreleasepool 本质就是一个队列(数组),
2. 当调用autorelease的时候会把该对象添加到autoreleasepool中,并且把引用计数+1
3. 当autoreleasepool即将销毁的时候,把其中的所有对象进行一次release操作
只要是一个对象对该block进行了强引用,在block内部有直接使用到该对象,
一般不用考虑,因为官方文档中没有告诉我们要注意发生强引用,所以推测系统控件一般没有对这些block进行强引用,所以我们可以不用考虑循环强引用的问题
串行队列和并行队列
总体上说: 使用 dispatch group,然后 wait forever 等待完成, 或者采取 group notify 来通知回调。
细节:
1. 创建异步队列
2. 创建dispatch_group dispatch_group_t = dispatch_group_create()
3. 通过组来执行异步下载任务
dispatch_group_async(queueGroup, aQueue, ^{
NSLog(@"下载图片.");
});
4.等到所有任务完成 dispatch_group_wait(queueGroup, DISPATCH_TIME_FOREVER);
5.合成图片
barrier:是障碍物的意思,在多个并行任务中间,他就像是一个隔离带,把前后的并行任务分开.
dispatch_barrier_async 作用是在并行队列中,等待前面操作并行任务完成再执行dispatch_barrier_async中的任务,如果后面还有并行任务,会开始执行后续的并行任务
容易误用造成死锁
- (void)viewDidLoad
{
[super viewDidLoad];
NSLog(@"1");
dispatch_sync(dispatch_get_main_queue(), ^{
NSLog(@"2");
});
NSLog(@"3");
}
// 添加键值观察
/**
1. 调用对象:要监听的对象
2. 参数
1> 观察者,负责处理监听事件的对象
2> 观察的属性
3> 观察的选项
4> 上下文
*/
[self.person addObserver:self forKeyPath:@"name" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context:@"Person Name"];
// NSObject 分类方法,意味着所有的 NSObject 都可以实现这个方法!
// 跟协议的方法很像,分类方法又可以称为“隐式代理”!不提倡用,但是要知道概念!
// 所有的 kvo 监听到事件,都会调用此方法
/**
1. 观察的属性
2. 观察的对象
3. change 属性变化字典(新/旧)
4. 上下文,与监听的时候传递的一致
可以利用上下文区分不同的监听!
*/
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
NSLog(@"睡会 %@", [NSThread currentThread]);
[NSThread sleepForTimeInterval:1.0];
NSLog(@"%@ %@ %@ %@", keyPath, object, change, context);
}
1.通过setValue:forKey: 给属性赋值
2.通过setValue:forKeyPath: 给属性赋值
3.直接调用setter方法方法给属性赋值
4.直接通过指针给属性赋值
5.
给这个value设置一个值,就可以触发了
都可以
1. 必须用在集合对象上或普通对象的集合属性上
2. 简单集合运算符有@avg, @count , @max , @min ,@sum,
3. 格式 @"@sum.age"或 @"集合属性.@max.age"
1.一个可以是成员变量
同上
因为视图已经对它有一个强引用了
User Defined Runtime Attributes 是一个不被看重但功能非常强大的的特性,
它能够通过KVC的方式配置一些你在interface builder 中不能配置的属性。当你希望在IB中作尽可能多得事情,
这个特性能够帮助你编写更加轻量级的viewcontroller
1.设置全局断点快速定位问题代码所在行
最常用就是 : po 对象
标签:write ons 生成 自定义 bullet 个人 跳过 nsstring 属性
原文地址:http://www.cnblogs.com/LiLihongqiang/p/6703955.html