IOS笔试题
面试题网址http://www.mianwww.com/html/category/it-interview/mobile
属性readwrite、readonly、assign、retain、copy、nonatomic各是什么作用,在那种情况下用?
assign用于简单数据类型,如NSInteger,double,bool,retain和copy用于对象,
readwrite是可读可写特性;需要生成getter方法和setter方法时;
readonly是只读特性 只会生成getter方法 不会生成setter方法 ;
不希望属性在类外改变assign是赋值特性,setter方法将传入参数赋值给实例变量;仅设置变量时;
retain表示持有特性,setter方法将传入参数先保留,再赋值,传入参数的retaincount会+1;copy表示赋值特性,setter方法将传入对象复制一份;需要完全一份新的变量时。nonatomic非原子操作,决定编译器生成的setter getter是否是原子操作,
atomic表示多线程安全,一般使用nonatomic-
Object -C 中创建线程的方法时什么?如果在主线程中执行代码,方法时什么?如果想延迟执行代码,方法又是什么?Phread、NSThread、GCD、NSOperation回到主线程的方法:
方法一:dispatch_async(dispatch_get_main_queue(), ^{ ….. });
方法二:
[self performSelectorOnMainThread: withObject:image waitUntilDone:YES];
延迟执行的方法: //延迟加载 3秒后执行show方法
方法一:performSelector方法
//[self performSelector:@selector(show) withObject:nil afterDelay:3];
方法二:定时器
//[NSTimer scheduledTimerWithTimeInterval:3 target:self selector:@selector(show) userInfo:nil repeats:NO];
方法三:sleep
// [NSThread sleepForTimeInterval:3];
// [self show];
方法四:GCD
dispatch_time double delayInSeconds = 3.0; __block ViewController* bself = self; dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW,(int64_t)(delayInSeconds * NSEC_PER_SEC)); dispatch_after(popTime, dispatch_get_main_queue(), ^{ [bself show]; });
-
#import跟#include有什么区别,@class呢?
#import能避免头文件被重复包含的问题:
- C/C++中包含头文件时用#include。( 使用include要注意重复引用的问题:解决办法#ifndef/#define/#endif)
-
#import 确定一个文件只能被导入一次,避免了重复引⽤的问题,在OC中我们基本用的都是 import。 #import< > 包含iOS框架类库⾥的类, #import""包含项目中自定义的类。@class通知编译器,其后面声明的名称是类的名称,至于这些类是如何定义的,暂时不用考虑
-
Object C中书写一个单例模式,使用GDB写单例?
//方法一:static SingletonPattern* _singletonPatternByNormal;+(id)sharedSingletonPatternByNormal{ if(!_singletonPatternByNormal) { _singletonPatternByNormal=[[SingletonPattern alloc]init]; } return _singletonPatternByNormal;}
//方法二://使用GCD dispatch_once
//适用场景:多线程安全
static SingletonPattern* _singletonPatternByGCD;
+(id)sharedSingletonPatternByGCD{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
_singletonPatternByGCD =[[SingletonPattern alloc]init];
});
return _singletonPatternByGCD;}
-
说明week和__week的作用及常用在什么时候?
week 一般是在属性的声明中 在@propert后面使用
__week 一般是在对象的声明中使用@property (weak, nonatomic) IBOutlet UIImageView *ImageView;__weak TRPoint *p1 = nil;//__weak将指针p1定义为弱引用
当弱引用指向一个强引用所持有的对象时,当强引用将对象释放掉后,弱引用会自动的被赋值为ni
-
书写一个block、并简单描述block ?
int (^block2)(int ,int)=^(int nAdd1,int nAdd2){ NSLog(@"有参数有返回值的block被执行"); return nAdd1+nAdd2; };
Object C
中多线程有几种实现方式,都有什么?简述Objective-C内存管理MRC与ARC的关系及其区别?
MRC 手都内存管理;ARC是自动内存管理。
当我们使用alloc,retain,new,copy或者mutableCopy的时候,引用计数+1,当我们使用release的使用,引用计数-1,当引用计数为0的时候,这个对象才会被彻底销毁,对象在销毁之前系统会自动的调用dealloc方法,在dealloc方法里面,如果这个对象还持有其他对的指针,那么需要先对这些指针进行release,再调用[super dealloc];IOS中持久化方式有哪些?
NSUserDefaults、plist、Archiving:归档、SQLite3和Core Data通知和代理的区别?
观察者模式:一个对象(A)想知道另一个对象(B)的状态是否发生了变化,A对象随B对象状态的改变而改变的过程,可以用观察的过程来控制,这种两个对象保持状态改变的一致的模式,叫做观察者模式
------共同点 利用通知和代理都能完成对象间的通信。(比如A对象告诉D对象发生了什么事情,A对象传递数据给D对象)
------不同点 代理:只能是一对一的关系(一个对象只能告诉另外一个对象发生了什么事情)通知:多对多关系(一个对象能告诉N个对象发生了什么事情,一个对象能得知N个对象发生了什么事情)
补充题目。MRC中Setter方法的实现setter方法的实现
-(void)setCar:(Car *)car {
if(_car!=car) {
[_car release];//对旧对象release一次
_car = [car retain];//对新对象retain一次}
}
1.Objective-C有多重继承吗?不是的话有什么代替方法?
没有多重继承( )多继承在这里是用protocol 委托代理 来实现的
2.简述#import跟#include的区别,@class呢?
#import和#include区别在与防止重复加载头文件
#import和@class @class 一般出现在头文件(.h)中。#import用于.m中。
例如A->B ,B->A.相互依赖时import会报错
3.简述线程与进程的区别和联系?
进程和线程都是操作系统中程序运行的基本单元,系统利用该基本单元实现系统对应用的并发性。差别在与不同的操作系统资源管理方式。
进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,而线程知识一个进程中的不同执行路径。
线程有自己的堆栈和局部变量,但线程之间没有独立的地址空间,一个线程死掉就等于整个线程死掉,所以多进程的程序要比多线程的程序健壮,但在进程切换时,耗费资源较大,效率要差一些。但对于一些要求同时进行并且又要共享某些变量的并发操作,只能用线程,不能用进程。
4.简述readwrite,readonly,assign,retain,copy,nonatomic属性的作用?
readwrite 是可读可写特性;
需要生成getter方法和setter方法时readonly 只读属性,只有getterassign 是赋值特性,setter方法将传入参数赋值给实例变量;
仅设置变量时;retain 表示持有特性,setter方法将传入参数先保留,再赋值,传入参数的retaincount会+1;
copy 表示拷贝特性,setter方法将传入对象复制一份;
需要完全一份新的变量时。nonatomic 非原子操作,决定编译器生成的setter getter是否是原子操作,atomic表示多线程安全,一般使用nonatomic
5.你在开发项目时,用到了哪些数据存储方式,iPhone中常见的方式有哪些,各有什么区别?
NSUserDefault (偏好设置) plist (属性列表) Archiving (归档) SQList Core Data
- 定义属性时,什么情况使用copy,assign和retain?
当我们需要获得一份全新的数据时采用copy;assign 设置变量参数时使用;retain
7.autorelease的对象是在什么时候被release的?
只是引用计数减一的时机不同而已,autorelease会在对象的使用真正结束的时候才做引用计数减一
8.对于C++/OC来说,类(class)与结构(struct)有什么区别?
class是引用类型,struct是值类型。引用类型a2值改变a1 也改变值类型a1付给a2开辟一块新的空间,a2改变a1不会随着改变。
9.内存的分配方式有哪几种?请简述。
1从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量,static变量。
2、在栈上创建。3、从堆上分配
10.冒泡排序
排序int num[ ] = {2,3,6,4,8,7}
int = i, j;
for(i = 0; i < num.count; i++ ) {
for (j = 0; j < num.count - i -1; j++ ) {
if( num[j]>num[j+1]) {
int temp = num[j];
num[j] = num[ j+1 ];
num[j+1] = temp;
}
}}
11.什么是代理(delegate),什么是协议(protocol)?两者有什么关系吗?
delegate它本身是一个设计模式,它的意思是委托别人去做某事。protocol协议就是要做的事。
12.根据你的理解,手工写出下面属性定义的setter方法。
@property(nonatomic,retain)NSString*name;-(void)setName:(NSString *)str { [str retain]; [name release];4 name = str;}
13.简述retain和copy的区别对象指向的还是原来的地址 引用计数器+1copy 将对象拷贝一份,完全新的简述ios的内存管理机制?自动内存计数 系统手动内存计数 程序员自己回收 谁创建谁销毁 简述你对 retain,copy,assign,strong,weak属性的理解?
retain:用于指针变量。就是说你定义了一个变量
assign: 用于非指针变量。用于基础数据类型
copy :它指出,在赋值时使用传入值的一份拷贝
strong:强引用,引用计数器加一,对象释放时减一
weak: 弱引用,不会加一减一
dealloc,release,autorelease的区别是什么?简述他们是如何工作的?
release是引用计数器减一dealloc是引用计数器为0时调用销毁对象Autorelease实际上只是把对release的调用延迟了,对于每一个Autorelease,系统只是把该Object放入了当前的Autorelease pool中,当该pool被释放时,该pool中的所有Object会被调用Release。 autorelease pool来避免频繁申请/释放内存(就是pool的作用了)。
简述一下delegate ,KVO,NSNotification的作用和区别? 解释一下什么是Lazy Loading?
懒加载,当要使用这个对象时调用,不使用就不会调用。节省内存。当加载大文件时就不建议使用,以空间换时间。
为什么说Objective-C是动态运行时语言? 简述IOS实现多线程有几种方式?多线程之间如何通讯?
GCD ,NSOperation,NSThread,PThread分为同步异步
你经常使用类NSObject的哪些方法?RunLoop是什么,在iOS中起到什麽作用? 为什么很多内置类如UITableViewControl的delegate属性都是assign而不retain?防止重复加载请问下面这段代码有什么问题?
(void)setAge:(int)newAge { Self.age=newAge; }
进入循环 self.age 会自动触发setter方法_age = newAge;
请使用OC编写Singleton设计模式的实现。
@interface Singleton : NSObject
+ (id)shardSingleton;
@end
static Singleton *_singleton = nil;
+ (id)shardSingleton {
if(!_singleton) {
_singleton = [[Singleton alloc] init];
}
return _singleton;
}
1.可变 数组用 copy会怎么样?
copy是深拷贝,又称为值拷贝,用copy修饰的可变数组 array会变成不可变
字符串 用strong会怎么样?
strong是浅拷贝,又称为指针拷贝,修饰的全局NSString类型,但在局部创建NSMutableString时
例如NSMutableString * str = 【NSMutableString stringWhitFomt:“456”】;
让string = str; 当NSMutableString的str改变时, strong修饰的NSString也跟着改变
用的同一个内存
2.oc-js 直接用原生的
js -> oc
先搭建一个桥梁stringByEvaluatingJavaScripFromString
shouldStarloadwiht什么来着我忘了
js调用oc方法,可以通过data 给oc传值
3.用charler抓包 用postMan模拟请求,
用wkwebview替代uiwebview,u或者在webviewDidFinishload中
加上[NSUserDefaules standerdUserDefaules]setInteger:0 forkey:“WebkitCacheModlePe..."]
请求方法URI协议/版本
请求头(Request Header)
请求正文
4.block 传值很方便,block适合两个控制器直接的关系,代理适合多个控制器传值传方法,遵从协议实现协议方法
5.通知和kvo的区别
通知需要 被观察者 先主动发送通知,然后观察者注册监听后才会做出响应。不过不仅可以监听属性的变化,还有方法,
kvo 在观察者里实现,是谁监听谁注册,被观察者只需要allobserver 来添加观察。然后不需要写任何代码, 观察者自己来实现 代理方法即可,
6.performSelector 延迟方法,只能在主线程中使用,
因为在主线程中 当事件开始的时候 runloop回创建一个timer ,而子线程不会创建 所以无法执行performSelector 的延迟方法,就是不能再异步中执行。
dispach_time可以 在异步中执行 ,使用dispach——after..
7.数据缓存方面的经验?
归档 NSUserDefaules sqlits FMDB NSURLCache
8.block循环引用,在block中用set方法调用全局变量 比如 self.name 会让name的引用计数计数+1,只要__weak把self重新引用一下就行了
9.类别,类别的作用 1: 将类的实现分散不同的类或者框架中
2: 将类的私有方法的优先级提高
3.创建协议
类别通常用来添加方法,添加属性的话 需要用到 runtime 在类别中重写set和get方法
【只能扩展类的方法,不能扩展类的属性】
10。例如 边里第三方SDK的私有API啦 用class_Ivar动态添加成员变量啦