iOS - 基础面试知识
1.arc(automatic reference counting)
- OC对象被创建时引用计数从默认值0加1,当它被释放时候引用计数减1,引用计数减0时
autorelease方法,销毁OC对象。 - 自动执行
autorelease方法是因为程序被加入到Autorelease pool中。 - arc遵守黄金法则.
- 自动释放池的栈的方式。
2.keyword
assign:一般用于基本数据类型,不能用于修饰OC对象!因为你assing修饰的oc对象在释放后虚拟地址还是存在的,可能导致内存渗漏。assign为什么是这样呢,可能跟它设定有关系,assign只会执行针对“纯量类型”做简单的赋值操作。这是我读《招聘一个靠谱的iOS》一文获取知识。weak:用于修饰OC对象弱引用,对象将要释放时自动清空地址,写下代码测试一下
3.__block在ARC和MRC下区别
- __block在
MRC下修饰OC对象是不是retain count加1的,而在ARC下会加1。 - __weak在ARC中的修饰OC对象,在block代码块中使用不会引起retain count加1(如果避免循环引用造成的内存泄露,可以使用__weak修饰,iOS5.0之后才可以使用)。
4.atomic一定是现成安全的吗?
no
5.+(void)load;+(void)initialize;有什么用处?
首先我建议看一下这个
这两个方法都是Class Method,都是程序运行开始就会调用,相对于runtime都只调用一次。
- load只要类被引用,就会调用load;
- initialize在被引用之后,使用类的时候,就会调用initialize;
为了说明,写几行代码:
//!> 步骤一:创建继承NSObject的类People
+ (void)load
{
NSLog(@"%s",__FUNCTION__);
}
+ (void)initialize
{
NSLog(@"%s",__FUNCTION__);
}
- (instancetype)init
{
self = [super init];
if (self)
{
NSLog(@"%s",__FUNCTION__);
}
return self;
}
- (void)dealloc
{
NSLog(@"%s",__FUNCTION__);
}
//!> 步骤二:尝试再各种情况下引用或者使用People这个类,看看效果并且总结。结果就是我说的那样。
/*
我推荐几种尝试的方式:
1.随便创建一个类,例如:Animal类,然后在Animal类中引用People。运行程序,结果:
+[People load]
2.在AppDelegate中,先引用,然后创建People对象。运行程序,结果:
+[People load]
+[People initialize]
-[People init]
-[People dealloc]
3.把方式‘1’和‘2’同时使用。运行程序,结果:结果同方式‘2’是一样的,这就说明,在runtime中类的load方法只执行一次。
4.把方式‘3’升级一下,首先,在Animal类的- (instancetype)init方法中new个People对象;然后在AppDelegate中创建Animal对象。运行程序,结果:
+[People load]
+[People initialize]
-[People init]
-[People init]
-[People dealloc]
-[People dealloc]
现在应该差不多有点懂了吧,然后有人会问runtime中为什么只执行一次,恩~,可以看看源代码我也不是很懂
*/
6.循环引用的例子
1.开发者文档中环引用案例(父子对象关系):
当两个不同的对象各有一个强引用指向对方,那么就产生循环引用.
//!> 错误代码示范,分别是Father.h和Son.h
#import "Son.h"
@interface Father : NSObject
@property (nonatomic, strong) Son * mySon; //*> 我是爹,我有一个儿子!
@end
#import "Father.h"
@interface Son : NSObject
@property (nonatomic, strong) Father * myFather; //*> 我是儿子,我有一个爹!
@end
/*
这样写导致了循环引用,官方说的这种最基本的错误的循环引用,容易造成容易修改,把儿子里面爹的声明的修饰关键词strong换成weak!如果有人说为啥不换成assign,其实你可以看看上面keyword关键词的区别,然后轻松搞定这种循环引用导致内存泄露。
*/
2.OC中的闭包Block:
闭包和匿名函数,需要了解一下.OC中block是代码块,都是独立内存对象,看了一些文章认为他就是代码中的函数,既然是函数,那么他就会retain他所引用的对象,并且block他还能引用上下文中的变量,可想而知,如果他引用了上下文中的全局属性,就有可能造成循环引用。例如:self。反正要切记,如果造成双方互相强制引用其对象就是循环引用!!如果需要对Block深究,这里。
7.为什么其他语言叫做函数调用,Objective-C里则成为对象发消息
Objective-C的Runtime是运行时库,它由C和汇编写的,为了是将C能够面向对象后来创造了Objective-C。Objective-C中的方法Selector其实是一个C数据结构,在runtime中定义成这样:typedef struct objc_method *Method;
举个栗子:假设在一个ViewController中,有一个对象receiver要执行一个方法selector,我们会这样调用:
//*> Objective-C中方法调用的[]方式,没有参数:
[receiver method];
//*> 运行时转换为:
objc_msgSend(receiver,@selector(method))
//*> Objective-C中方法调用[]方式,含有多个参数:
[receiver methodArg1:arg1 Arig2:arg2 ··· ···];
//*> 运行时转换为:
objc_msgSend(receiver,@selector(methodArg1:Arg2:Arg3: · · ·))
说明:Objective-C中向receiver发送一个method并会意味着receiver去执行method,receiver可能会执行method、转发method或消息、自定义执行方法等等。所以简单来说,Objective-C中的函数调用其实就是发送一个消息。哇嘎嘎~
8.什么是method swizzling
像Window编程方法的hock方法,也就是利用Objective-C动态特性,在向一个receiver发送一个@selector(method)之后,在运行时偷换method。挂钩(需要百度)
这些需要你理解,IMP,Method,Selector的含义和作用,可以看我介绍Method的博客。
13年一个前辈写了一篇文章:Objective-C的hook方案(一):Method Swizzling
9.UIView和CALayer是啥关系
UIView相比较单纯CALayer就是一个管理控件,UIView本身就有一个CALayer管理自身的显示,除了这些,UIView自己还有很多功能。CALayer专一显示作用的,CALayer和UIView都是树结构,addSubview和addSublayer都是叠加原理一样。
10.如何高性能给UIImageView加个圆角?
UIImageView继承UIView,自然可以通过自带的CALayer的属性cornerRadius设置圆角,但是会导致离屏渲染,导致渲染效率降低。所以如何使用高性能设置圆角呢?
1.由于UIImageView的特殊性,一般作为UIImage图片的载体,可以通过裁剪UIImage成圆角,然后加在UIImageView上。搞定~没错,恩恩
iOS - 基础面试知识的更多相关文章
- Java中的框架基础面试知识
spring mvc 工作机制(原理): DispatcherServlet主要用作职责调度工作,本身主要用于控制流程 Spring mvc运行原理 1.springmvc将所有的请求都提交给Disp ...
- iOS基础问答面试
<简书社区 — Timhbw>iOS基础问答面试题连载(一)-附答案:http://www.jianshu.com/p/1ebf7333808d <简书社区 — Timhbw> ...
- JAVA多线程和并发基础面试问答(转载)
JAVA多线程和并发基础面试问答 原文链接:http://ifeve.com/java-multi-threading-concurrency-interview-questions-with-ans ...
- [转] JAVA多线程和并发基础面试问答
JAVA多线程和并发基础面试问答 原文链接:http://ifeve.com/java-multi-threading-concurrency-interview-questions-with-ans ...
- JAVA多线程和并发基础面试问答
转载: JAVA多线程和并发基础面试问答 多线程和并发问题是Java技术面试中面试官比较喜欢问的问题之一.在这里,从面试的角度列出了大部分重要的问题,但是你仍然应该牢固的掌握Java多线程基础知识来对 ...
- 【多线程】JAVA多线程和并发基础面试问答(转载)
JAVA多线程和并发基础面试问答 原文链接:http://ifeve.com/java-multi-threading-concurrency-interview-questions-with-ans ...
- [置顶] IOS 基础入门教程
IOS 基础入门教程 教程列表: IOS 简介 IOS环境搭建 Objective C 基础知识 创建第一款iPhone应用程序 IOS操作(action)和输出口(Outlet) iOS - 委托( ...
- Java---常用基础面试知识点
综合网上的一点资源,给大家整理了一些Java常用的基础面试知识点,希望能帮助到刚开始学习或正在学习的学员. 1.抽象 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方 ...
- (转)JAVA多线程和并发基础面试问答
JAVA多线程和并发基础面试问答 原文链接:http://ifeve.com/java-multi-threading-concurrency-interview-questions-with-ans ...
随机推荐
- win8/8.1 免密码登录设置
http://www.ehow.com/how_8013338_start-windows-password.html 原文见上方链接 1,win+r调出命令输入窗口,输入 netplwiz 回车 2 ...
- VS2013无法链接到TFS(Visual studio online),错误TF31001,TF31002
TF31002: Unable to connect to VisualStudio Online with VS 2013 but I can using web access - Windows ...
- HTTP 错误 500.24 - Internal Server Error的解决方法
错误提示: 最可能的原因: system.web/identity@impersonate 设置为 true. 解决办法: 现在经典模式 连微软都几乎放弃了 原设想是为iis不断升级 提供的一种兼 ...
- import random 模块导入
import random print(random.random()) #浮点数值 print(random.randint(1,2))#循环显示1,2 print(random.randrange ...
- Linux IO Scheduler(Linux IO 调度器)
每个块设备或者块设备的分区,都对应有自身的请求队列(request_queue),而每个请求队列都可以选择一个I/O调度器来协调所递交的request.I/O调度器的基本目的是将请求按照它们对应在块设 ...
- Ubuntu下tftp服务器的搭建
参考博客:http://blog.chinaunix.net/uid-26495963-id-3206829.html 1. 安装 $ apt-get install tftp-hpa tftpd-h ...
- 在Windows .NET平台下使用Memcached
网上关于Memcached的文章很多,但据我观察,大多是互相转载或者抄袭的,千篇一律.有些则是直接整理的一些超链接然后贴出来.那些超链接笔者大概都进去看了,其实关于Memcached的中文的技术文章, ...
- Dubbo系列_概述
一.本文目的 学习使用Dubbo也有一段时间了,准备写一个系列文章介绍Dubbo的相关知识和使用,供自己以后回顾和他人学习.有兴趣的同学可以加入群:74085440一起探讨 二.书写计 ...
- Jenkins_多项目构建(二):使用Maven聚集关系
一.假设有四个Maven项目 1.soa-dub-parent:父项目 1 2 3 4 5 <modules> <module>../soa-dub-f ...
- 【BZOJ 2005】【NOI 2010】能量采集 数论+容斥原理
这题设$f(i)$为$gcd(i,j)=x$的个数,根据容斥原理,我们只需减掉$f(i×2),f(i×3)\cdots$即可 那么这道题:$$ans=\sum_{i=1}^n(f(i)×((i-1)× ...