1.简述OC中内存管理机制。与retain配对使用的方法是dealloc还是release,为什么?需要与alloc配对使用的方法是dealloc还是release,为什么?readwrite,readonly,assign,retain,copy,nonatomic,atomic,strong,weak属性的作用?
2.类变量的@protected,@private,@public,@package,声明各有什么含义
1、使用线程可以把程序中占据时间长的任务放到后台去处理,如图片、视频的下载
2、发挥多核处理器的优势,并发执行让系统运行的更快、更流畅,用户体验更好
缺点:
1、大量的线程降低代码的可读性,
2、更多的线程需要更多的内存空间
3、当多个线程对同一个资源出现争夺的时候要注意线程安全的问题。
1、NSThread(两种创建方式)
[NSThread detachNewThreadSelector:@selector(doSomething:) toTarget:selfwithObject:nil];
NSThread *myThread = [[NSThread alloc] initWithTarget:selfselector:@selector(doSomething:) object:nil];
[myThread start];
2、NSOperationQueue
NSOperationQueue *oprationQueue = [[NSOperationQueuealloc] init];
oprationQueue addOperationWithBlock:^{
//这个block语句块在子线程中执行
}
http://alloc.sinaapp.com/wp/?p=237
3、Grand Central Dispatch (GCD)
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0), ^{
// 耗时的操作
dispatch_async(dispatch_get_main_queue(), ^{
// 更新界面
});
});
http://blog.youkuaiyun.com/totogo2010/article/details/8016129
PS:不显示的创建线程的方法:
用NSObject的类方法 performSelectorInBackground:withObject: 创建一个线程:
[ObjperformSelectorInBackground:@selector(doSomething) withObject:nil];
答:一个进程启动的多个不相干线程,它们相互之间关系为异步。
同步:多线程同时操作一个数据 这个时候需要对数据添加保护 这个保护就是线程的同步。
用GCD中的串行队列来解释多线程的同步,也就是队列中的任务为串行,它们各自对相邻的任务有依赖性,如果任务1不完成,那么任务2就不会开始,这就是同步
6.假设有一个字符串aabcad,请写一段程序,去掉字符串中不相邻的重复字符串,既上述字符串处理之后的输出结果为:aabcd
答:
NSMutableString *str = [[NSMutableString alloc]initWithFormat:@"aabcad"];
NSMutableArray *marry = [[NSMutableArray alloc]init];for (int i = 0; i < str.length - 1; i++) {
unsigned char a = [str characterAtIndex:i];
for (int j = i + 1; j < str.length; j++) {
unsigned char b = [str characterAtIndex:j];
if (a == b) {
if (j == i + 1) {
}else{
[marry addObject:[NSString stringWithFormat:@"%d",j]];
}
}
}
}
for (int i = marry.count - 1; i > 0; i--) {
NSInteger num = [[marry objectAtIndex:i]intValue];
[str deleteCharactersInRange:NSMakeRange(num, 1)];
}
7.获取一台设备唯一标示的方法有哪些?
答: 1.UDID
2.UUID
3.MAC ADDRESS
4.OPEN UDID
5.广告标识符
6.Vindor标示符
ios7之后用的时keychain(钥匙串)
8.ios类是否可以多继承?如果没有,那可以用其他方法实现吗?简述实现过程。
答:没有 用catogory、extension来实现 实现过程我会在ios复习中提到
9.堆和栈的区别?
答: 栈区(stack)--由编译器自动分配释放,存放函数的参数值、局部变量的值。
堆区(heap)--一般由程序员分配释放。
全局区(静态区)(static)--全局变量和静态变量。程序结束后由系统释放。
文字常量区--常量字符串存放在这里。程序结束后由系统释放。
程序代码区—存放函数体的二进制文件。
栈:只要栈的剩余空间大于所申请空间,系统将为程序提供内存,否则将报异常提示栈溢出。
堆:首先应该知道操作系统有一个记录空闲内存地址的链表,当系统收到程序的申请时,会遍历该链表,寻找第一个空间大于所申请空间的堆结点,然后将该结点从空闲结点链表中删除,并将该结点的空间分配给程序,另外,对于大多数系统,会在这块内存空间中的首地址处记录本次分配的大小,这样,代码中的delete语句才能正确的释放本内存空间。另外,由于找到的堆结点的大小不一定正好等于申请的大小,系统会自动的将多余的那部分重新放入空闲链表中。
10.ios本地数据存储都有哪几种方式?
答: 1.NSKeyedArchiver(归档)采用归档的形式来保存数据,该数据对象需要遵守NSCoding协议,并且该对象对应的类必须提供encodeWithCoder:和initWithCoder:方法。
2.NSUserDefaults:用来保存应用程序设置和属性、用户保存的数据。用户再次打开程序或开机后这些数据仍然存在。NSUserDefaults可以存储的数据类型包括:NSData、NSString、NSNumber、NSDate、NSArray、NSDictionary。
3. Write写入方式:永久保存在磁盘中
4. SQLite(FMDB、CoreData)
答:
12.深拷贝和浅拷贝的理解?
答: 深拷贝拷贝的是内容,浅拷贝拷贝的是指针。深拷贝和浅拷贝最大的区别就是子类对象的地址是否改变,如果子类对象的地址改变那么就是深拷贝。
13.怎样实现一个singleton的类。
答:单例
static LOSingleton * shareInstance;
+( LOSingleton *)sharedInstance{
@synchronized(self){//这个东西其实就是 一个加锁。如果self 其他线程访问,则会阻塞。这样做一般是用来对单例 进行一个死锁的保护
if (shareInstance == nil) {
shareInstance = [[superallocWithZone:NULL] init];
}
}
returnshareInstance;
}
+(LBookCityView *)shareInstance
{
static LBookCityView *_LBookCityView = nil;
@synchronized(self){
if (!_LBookCityView ) {
_LBookCityView = [[LBookCityView alloc]init];
}
}
return _LBookCityView;
}
//第二种方式
+ (LOSingleton *) sharedInstance
{
static LOSingleton *sharedInstance= nil ;
static dispatch_once_tonceToken; // 锁
dispatch_once (& onceToken, ^ { // 最多调用一次
sharedInstance = [[self alloc]init];
});
return sharedInstance;
}
14.什么是安全释放?
答:把对象指针置为nil,再对其释放。15.RunLoop是什么?
答:runloop是事件接收和分发机制的一个实现。
一个runloop就是一个事件处理循环,用来不停的调配工作以及处理输入事件。使用run loop的目的是使你的线程在有工作的时候工作,没有的时候休眠。
run loop需要处理的event source 有两种:input sources(常是其他线程的异步的event)和timer sources(定时器)。16.什么是序列化和反序列化,可以用来做什么?如何在OC中实现复杂对象的存储?
答: 如果你需要存储一个复杂的对象的话,经常要以二进制的方法序列化这个对象,这个过程叫Archiving。如果一个对象需要进行序列化,那么需要遵循NScoding协议,主要有两个方法:
-(id)initWithCoder:(NSCoder*)coder;//从coder中读取数据,保存到相应变量中,即反序列化数据。
-(void)encodeWithCoder:(NSCoder*)coder;//读取实例变量,并把这些数据写到coder中去,即序列化数据。
17.写一个标准宏MIN,这个宏输入两个参数并返回较小的一个?
答: #definekMIN(X,Y) ((X) > (Y)) ? (Y) :(X)18.iphone os 有没有垃圾回收机制?简单阐述一下OC内存管理。
答: iphoneos没有垃圾回收机制。
垃圾回收机制用于在空闲时间以不定时的方式动态的回收无任何引用的对象占据的内存空间。
19.简述应用程序按Home键进入后台时的生命周期,以及从后台回到前台时的生命周期?
答: Notrunning 未运行,程序没启动
Inactive 未激活,程序在前台运行,不过没接受到事件,没有事件处理的状态下通常处于这个状态。
Active 激活 程序在前台并且接收到了时间
Backgound 后台 程序在后台而且能执行代码,大多数程序进入这个状态后会在在这个状态上停留一会。
Suspended 挂起 程序在后台不能执行代码。
//告诉代理进程启动但还没进入状态保存
- (BOOL)application:(UIApplication*)application willFinishLaunchingWithOptions:(NSDictionary *)launchOptions
// 告诉代理启动基本完成程序准备开始运行
-(BOOL)application:(UIApplication *)applicationdidFinishLaunchingWithOptions:(NSDictionary *)launchOptions
// 当应用程序将要入非活动状态执行,在此期间,应用程序不接收消息或事件,比如来电话了
-(void)applicationWillResignActive:(UIApplication *)application
// 当应用程序入活动状态执行,这个刚好跟上面那个方法相反
-(void)applicationDidBecomeActive:(UIApplication *)application
// 当程序被推送到后台的时候调用。所以要设置后台继续运行,则在这个函数里面设置即可
-(void)applicationDidEnterBackground:(UIApplication *)application
//当程序从后台将要重新回到前台时候调用,这个刚好跟上面的那个方法相反。
- (void)applicationWillEnterForeground:(UIApplication*)application
//当程序将要退出是被调用,通常是用来保存数据和一些退出前的清理工作。这个需要要设置UIApplicationExitsOnSuspend的键值。
-(void)applicationWillTerminate:(UIApplication *)application
//当程序载入后执行
-(void)applicationDidFinishLaunching:(UIApplication*)application
答: alloc申请内存时调用
loadView加载视图时调用
ViewDidLoad视图已经加载后调用
ViewWillAppear视图将要出现时调用
ViewDidUnload视图已经加载但没有加载出来调用<iOS6之后废弃>
dealloc销毁该视图时调用
init视图初始化时候调用
21.描述应用程序的启动顺序。
答: 1. 程序入口main函数创建UIApplication实例和UIApplication代理实例。
2. 在UIApplication代理实例中重写启动方法,设置根ViewController。
3. 在第一ViewController中添加控件,实现应用程序界面。
22.为什么很多内置类如UITableViewControl的delegate属性都是assign而不是retain?请举例说明。
答: 避免循环引用
Student * str=[];
Teacher*teacher=[[Teacher alloc] init];
Student *student=[[Student alloc] init];
teacher.delegate=student;
student.delegate=teacher;
在teacher中dealloc会release当前的Delegate,就会触发student对象release,继而也会导致student执行dealloc,在student中也会release自己的delegate,产生循环了。
23.使用UITableView时候必须要实现的几种方法?
答://这个方法返回每个分区的行数
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section;
//这个方法返回我们调用的每一个单元格
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;
24.写一个便利构造器。
答: - (id)studentWithName:(NSString *)name andAge:(NSInter)age{
MyView *view = [[MyView alloc]initWithName:name andAge:age];
return [view autorelease];
}25.UIImage初始化一张图片有几种方法?简述各自的优缺点。
答: 3种
imageNamed:系统会先检查系统缓存中是否有该名字的Image,如果有的话,则直接返回,如果没有,则先加载图像到缓存,然后再返回。
initWithContentsOfFile:系统不会检查系统缓存,而直接从文件系统中加载并返回。
imageWithCGImage:scale:orientation 当scale=1的时候图像为原始大小,orientation制定绘制图像的方向。
1.回答person的retainCount值,并解释为什么?
Person *per = [[Person alloc]init];
self.person = per;
答:1或者2,alloc+1,assign+0,retain+1
2.这段代码有什么问题吗?
@implementation Person
-(void)setAge:(int)newAge{self.age = newAge;}
UIView继承于UIResponder,
UIResponder继承于NSObject,UIView可以响应用户事件。
CALayer继承于NSObject,所以CALayer不能响应事件。
UIView构建界面,UIView侧重于对内容的管理,CALayer侧重于对内容的绘制。
UIView是用来显示内容的,可以处理用户事件;
CALayer是用来绘制内容的,对内容进行动画处理依赖与UIView来进行显示,不能处理用户事件。
json底层原理便利字符串中的字符,最终根据各市规定的特助字符,比如{},[],:号等进行区分,{}是字典,[]表示的时数组,:号是字典的键和值的分水岭,最总是将json数据转化为字典。
Xml两种解析方式,DOM和SAX,DOM需要读入整个XML文档(文档驱动),SAX是事件驱动的,并不需要读入整个文档,文档的读入过程也就是SAX的解析过程。
KVC键值编码,可以直接通过字符串的名字(key)来间接访问属性的机制,而不是通过调用getter和setter方法访问。
KVO:观测指定对象的属性,当指定对象的属性更改之后会通知相应的观察者。
delegate:一对一,delegate遵循某个协议并实现协议声明的方法。监听一系列事件
@private来修饰私有变量
OC中所有的实例变量默认都是私有的,所有的实例方法默认都是公有的
#import在OC中引入自己创建的头文件#import””或者系统框架#import<>。#import不会出现交叉编译
@class对一个类进行声明,告诉编译器有这个类,但是类的定义什么的都不知道
NSMutableArray *array = [[NSMutableArray alloc]init];//本地敏感字库
imageView和UILable响应链是断开的
UIAppliction(询问)(关闭应用程序beginIgoringInteractionEvents忽略事件,endIgnoringInteractionEvents打开)->windew()->rootViewController上的view.想要获得下一个视图nextResponse
1.程序运行时才确定知己的真实类型
2.静态在编译期间才确定知己的真实类型
3.真实类型有有关
drawRect实现绘制,重写方法
layoutSubviews当bounds发生改变时,布局子视图,需要setNeedflayout来调用
HTTP:超文本传输协议,短协议.面向连接的全双工的通讯协议
双工:双方都可以对话.
TCP:三次握手.第一:传递 ,第二确定,第三回复确认(连接)(断开拿走东西)属于网络层
.UDP:面向非连接:半双工发送越大丢包越多.
Scoket :时时操作,长连接,
声明:
#import<Foundation/Foundation.h>
typedef void(^TestBlock)(NSString*string);
@interface LO_Person : NSObject
+(void)showStringFromBlcok:(TestBlock)justBlock;
@end
实现:
#import "LO_Person.h"
@implementation LO_Person
+(void)showStringFromBlcok:(TestBlock)justBlock
{
NSString *str = @"测试blcok";
justBlock(str);
}
@end
调用:
[LO_Person showStringFromBlcok:^(NSString *string) {
NSLog(@"-- %@",string);
}];
int sl(const char *s)
{
}