iOS笔试题01
1. #import 跟#include、@class有什么区别?#import<> 跟 #import”"又什么区别?
1> #import和#include都能完整地包含某个文件的内容,#import能防止同一个文件被包含多次
2> @class仅仅是声明一个类名,并不会包含类的完整声明;@class还能解决循环包含的问题
3> #import <> 用来包含系统自带的文件,#import “”用来包含自定义的文件
2. 属性readwrite,readonly,assign,retain,copy,nonatomic,atomic,strong,weak 各是什么作用,在那种情况下用?
1> readwrite:同时生成get方法和set方法的声明和实现
2> readonly:只生成get方法的声明和实现
3> assign:set方法的实现是直接赋值,用于基本数据类型
4> retain:set方法的实现是release旧值,retain新值,用于OC对象类型
5> copy:set方法的实现是release旧值,copy新值,用于NSString、block等类型
6> nonatomic:非原子性,set方法的实现不加锁(比atomic性能高)
7> atomic:原子性,线程安全,set方法的实现加锁。
8> strong:强指针引用的对象,系统不会自动释放
9> weak:弱指针引用的对象,系统会立即释放
ARC中的@property参数使用小结:
1> 控件用weak 相当于MRC的assign
2> 属性对象用strong(如:NSArray *DataList)相当于MRC的retain
3> 非对象类型用assign 相当于MRC的assign
4> 字符串NSString用copy 相当于MRC的copy
strong和copy的区别:
ARC下copy在苹果的默认实现全是浅拷贝(除了对可变对象的copy) ,现在的strong和copy没有区别(不可变对象)。
使用strong,则与可变对象指向同一块内存区域,可变对象的内容改变,其赋值对象也跟着改变,因为两者是同一个指针;
而使用copy,在赋值之前,将可变对象内容复制,创建一个新的内存区域,所以两者不是一个指针地址,可变对象的改变不会导致其赋值对象的改变。深拷贝不变,浅拷贝变。
3. 写一个setter方法用于完成@property (nonatomic,retain)NSString *name,写一个setter方法用于完成@property(nonatomic,copy)NSString *name.
1> @property (nonatomic, retain) NSString *name;
- (void)setName:(NSString *)name
{
if (_name != name) {
[_name release];
_name = [name retain];
}
}
2> @property(nonatomic, copy) NSString *name;
- (void)setName:(NSString *)name
{
if (_name != name) {
[_name release];
_name = [name copy];
}
}
4. 对于语句NSString*obj = [[NSData alloc] init]; ,编译时和运行时obj分别是什么类型?
1> 编译时是NSString类型
2> 运行时是NSData类型
5. 常见的object-c的数据类型有那些, 和C的基本数据类型有什么区别?
1> 常用OC类型:NSString、NSArray、NSDictionary、NSData、NSNumber等
2> OC对象需要手动管理内存,C的基本数据类型不需要管理内存
6. id 声明的变量有什么特性?
Id声明的变量有运行时特性。id声明的变量能指向任何OC对象
5.2 instancetype & id
1> instancetype在类型表示上,跟id一样,可以表示任何对象类型
2> instancetype只能用在返回值类型上,不能像id一样用在参数类型上
3> instancetype比id多一个好处:编译器会检测instancetype的真实类型
7. Objective-C如何对内存管理的,说说你的看法和解决方法?
1> 每个对象都有一个引用计数器,每个新对象的计数器是1,当对象的计数器减为0时,就会被销毁
2> 通过retain可以让对象的计数器+1、release可以让对象的计数器-1
3> 还可以通过autorelease pool管理内存
4> 如果用ARC,编译器会自动生成管理内存的代码。编译器会自动在适当的地方插入适当的retain、release、autorelease语句。你不再需要担心内存管理,因为编译器为你处理了一切。ARC并不是GC,它只是一种代码静态分析(Static Analyzer)工具。
8. 内存管理的几条原则是什么?按照默认法则.哪些方法生成的对象需要手动释放?在和property结合的时候怎样有效的避免内存泄露?
1> 谁创建谁释放。只要调用了alloc、copy、new方法产生了一个新对象,都必须在最后调用一次release或者autorelease
2> 谁retain谁release。只要调用了retain,都必须在最后调用一次release或者autorelease
3> @property如果用了copy或者retain,就需要对不再使用的属性做一次release操作
4> 如果用了ARC,编译器会自动生成管理内存的代码
1. 看下面的程序,三次NSLog会输出什么?为什么?
NSMutableArray* ary = [[NSMutableArray array] retain];
NSString *str = [NSString stringWithFormat:@"test"]; // 1
[str retain]; // 2
[ary addObject:str]; // 3
NSLog(@"%d", [str retainCount]);
[str retain]; // 4
[str release]; // 3
[str release]; // 2
NSLog(@"%d", [str retainCount]);
[ary removeAllObjects]; // 1
NSLog(@"%d", [str retainCount]);
结果:3、2、1
2. OC中创建线程的方法是什么?如果指定在主线程中执行代码?如何延时执行代码?
1> 创建线程的方法
- NSThread
- NSOperationQueue和NSOperation
- GCD
2> 主线程中执行代码
- [self performSelectorOnMainThread: withObject: waitUntilDone:];
- [self performSelector: onThread:[NSThread mainThread] withObject: waitUntilDone:];
- dispatch_async(dispatch_get_main_queue(), ^{
});
3> 延时执行
- double delayInSeconds = 2.0;
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW,
(int64_t)(delayInSeconds * NSEC_PER_SEC));
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
});
- [self performSelector: withObject: afterDelay:];
- [NSTimer scheduledTimerWithTimeInterval: target: selector: userInfo: repeats:];
iOS笔试题01的更多相关文章
- YouKu iOS笔试题一
序言 最近收到某某同学将去youku的iOS笔试题的邮件,希望笔者能整理一下,并提供参考答案.笔者决定整理出来,并分享给大家.当然,与此同时,也想看看youku的笔试题到底有多难,也考考自己有多少料吧 ...
- 一份中规中矩的 iOS笔试题
一.背景 因为一些原因,我从公司离职,在此之前,我需要帮忙招聘一个新人来做我的工作,于是就有了这篇文章. 由于公司项目16年就已经上线了,前同事写的项目中,有用xib.storyBoard.代码自动布 ...
- 2016年iOS笔试题
收集了一些ios面试的一些基础的试题,其中也有一些较难的 1.请简述UIView与CALayer有什么不同.2.Block什么情况下会保留实体内引用到外部对象,什么时候要用__block或__weak ...
- ios笔试题(选择题)
1-10 C语言 & 计算机基础 1.请看下面一段代码 static int a = 1; int main(){ int b = 2; char *c = NULL; c = (char * ...
- ios笔试题
最近找工作,有面试有笔试部分,故把笔试题自己整理了下. 面试能力要求:精通iphone的UI开发,能熟练操作复杂表视图,熟练使用图层技术, 可以自定义UI控件,使用类别扩展系统控件功能; 擅长通讯 ...
- iOS笔试题04
1. Object-C有多继承吗?没有的话用什么代替? 1> OC是单继承,没有多继承 2> 有时可以用分类category和协议protocol来代替多继承 2. Object-C有私 ...
- iOS笔试题02
1. Difference between shallow copy and deep copy? 1> 浅拷贝:指针(地址)拷贝,不会产生新对象 2> 深拷贝:内容拷贝,会产生新对象 2 ...
- 面试中遇到的iOS笔试题
1.浅复制和深复制的区别? 2.类别的作用(category)?继承和类别在实现有何区别? 3.类别(category)和类扩展(extension)的区别. 4.obc中的协议和java中的接口概念 ...
- iOS面试题01
1.#import和#include.@class有什么区别?#import<>和#import“”又有什么区别? 答:1.#import和#include都能完整地包含某个文件的内容,# ...
随机推荐
- 怎么才能零基础彻底学会Java
21世纪进入信息时代,信息科技给人类的生产和生活方式带来了深刻的变革,信息产业已成为推动国家经济发展的主导产业之一,Java编程语言作为含金量极高的一门IT技术,很多人希望从事这个行业,那么想学好Ja ...
- __str__()方法
只要定义了__str__(self)方法,那么就会打印从这个方法中return的数据 class Car: def __init__(self, newWheelNum, newColor): sel ...
- python - super 寻找继承关系
""" super 是根据当前类对象的 mro 的继承顺序进行函数的调用的 """ class Base(object): def fn(s ...
- 使用webuploader实现大文件上传分片上传
本人在2010年时使用swfupload为核心进行文件的批量上传的解决方案.见文章:WEB版一次选择多个文件进行批量上传(swfupload)的解决方案. 本人在2013年时使用plupload为核心 ...
- vue+上传文件夹
在做项目开发的时候,上传东西无论文件也好,还是文件夹都需要用到 <input type="file" id="filepicker" name=" ...
- fdisk分区命令
fdisk是Linux系统中最常用的分区工具,通过这个命令也可以查看系统中所有可用的分区,但是这个命令只支持MBR的分区表(这句话应该只对某些系统,CentOS7-1810适用,Debian9.5和o ...
- [Luogu] 树链剖分
模板题,对于对为某个点为根的子树进行处理时,只需每个节点记录两个值 分别为搜索以该节点为根的子树时的最初搜索序和最末搜索序,将这两 个数作为线段树区间操作的端点进行操作 #include <bi ...
- PHP全栈学习笔记24
PHP in_array() 函数 定义和用法 in_array() 函数搜索数组中是否存在指定的值. type 参数被设置为 TRUE,则搜索区分大小写. 语法 in_array(search,ar ...
- 数据结构实验之二叉树一:树的同构 (SDUT 3340)
题解:把原本结构体的左右子树的类型定义成 int 型,用来存放这个结点的左右子树的编号,分别建造两棵二叉树,按个比较,如果在第二棵树中没有找到,那么就不用在判断了. #include <bits ...
- P3956 棋盘——普及题,儿童搜索
P3956 棋盘 这道搜索弄得我很难受. 第一,一定要看清楚题在写.第二,弄清楚判断条件: 首先图的大小是m*m不是n*m; 然后就是当前有颜色的点是不用变颜色的: #include<cstdi ...