1....简述OC中内存管理机制,与retain配对使用的方法是dealloc还是release,为什么?需要与alloc配对使用的方法是dealloc还是release,为什么?readwrite,readonly,assign,retain,copy,nonatomic,atomic,strong,weak属性的作用?
OC中使用了一种叫做引用计数的机制来管理对象,如果对一个对象使用了alloc,[Mutable]copy,retain,那么你必须使用相应的release或者autorelease,也可以理解为自己生成的对象,自己持有,非自己生成的对象,自己也能持有,在不需要自己持有的对象时释放.非自己持有的对象无法释放.生成并持有对象<alloc,new,copy,mutableCopy等>,持有对象<retain>,释放对象<release>,废弃对象<dealloc>.readwrite(默认):可读可写,表示既有getter方法,也有setter方法.readonly:表示只有getter方法,没有setter方法.nonatomic:不考虑线程安全.atomic(默认):线程操作安全.strong(默认):ARC和MRC下retain一样,weak(ARC下):和(MRC下)assign类似,区别是当weak指向的内存释放掉后自动置为nil.防止野指针.unsafe_unretained声明一个若引用,但不会自动置为nil,可能会出现野指针
2........线程安全下的setter和getter方法
-(NSString *)value{
@synchronized (self){
return [[_value retain] autorelease];
}
}
-(void)setValue:(NSString*)aValue{
@synchronized(self){
[_value release];
_value = [aValue retain];
}
}
3......类变量的@protected,@private,@public,@package,声明各有什么含义?
上面的几个声明表明的是类成员的作用域,@private作用范围只能在自身类(外界即不可访问,又不能继承);@protected作用范围在自身类和子类,如果什么都不加修饰,默认是@(protected)(外界不可访问,但是可以继承);@phblic作用范围最大,可以在任何地方被访问(外界即可访问,又可以继承);@package作用范围在某个框架内
4......线程是什么?进程是什么?二者有什么区别和联系?
线程是CPU独立运行和独立调度的基本单位(可以理解为一个进程中执行的代码片段),进程是资源分配的基本单位(进程是一块包含了资源的内存区域).进程是线程的容器,真正完成代码执行的是线程,而进程则作为线程的执行环境.一个程序至少包含一个进程,一个进程至少包含一个线程,一个进程中的多个线程共享当前进程所拥有的资源.
5.......谈谈你对多线程开发的理解? ios 中又几种实现多线程的方法?
好处:
(1).使用线程可以把程序中中占据时间长的任务放到后台去处理,如图片,视频的下载
(2). 发挥多核处理器的优势,并发执行让系统运行的更快,更流畅,用户体验更好
缺点:
(1)大量的线程降低代码的可读性
(2)更多的线程需要更多的内存空间
(3)当多个线程对同一个资源出现争夺的时候需要注意线程安全的问题
iOS 有三种多线程编程的技术:1. NSThread(两种创建方式)
[NSThread detachNewThreadSelector:@selector(doSomething:) toTarget:self withObject:nil];
NSThread *myThread =[ [NSThread alloc] initWithTarget:self selector:@selector(doSomething:) object:nil];
2. NSOperationQueue
http://alloc.sinaapp.com/wp/?p=237
NSOperationQueue *operationQueue = [[NSOperationQueue alloc] init];
operationQueue addOperationWithBlock:^{
// 这个语句在子线程中执行
}
3. Grand Central Dispatch(GCD)
http://blog.youkuaiyun.com/totogo2010/article/details/8016129
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0),^{
// 耗时的操作
dispatch_async(dispatch_get_main_queue(),^{
// 更新界面
});
});
PS:不显示的创建线程的方法:
用NSObject的类方法 performSelectorInBackgroud:withObject:
创建一个线程:[Obj performSelectorInBackground: @selector(doSomething) withObject:nil];
5.........线程同步和异步的区别?ios中如何实现多线程的同步?
同步:一个线程要等待上一个线程执行完之后才能执行当前的线程
异步:同事去做两件或者多件事.比如边听歌边看报
原子操作(atomic),加锁(NSLock, NSRecursive,NSConditionLock ,@synchronized)
http://blog.youkuaiyun.com/lifengzhong/article/details/7487505
6.............假设有一个字符串aabcad,请写一段程序,去掉字符串中不相邻的重复字符串,即上述字符串处理之后的输出结果为:aabcd
-(void) removeRepeat:(NSString *)aNum
{
NSMutableArray *mArr = [[NSMutableArray alloc]initWithCapacity:10];
for(int i = 0; i<aNum.length; i++)
{
[mArr addObject:[aNum substringWithRange:NSMakeRange(i,1)]];
}
NSLog(@"%@",mArr);
[self compareNum:mArr];
NSLog(@"%@",mArr);
}
// 比较是否相等
-(NSMutableArray *)compareNum:(NSMutableArray *)mArr
{
int count = mArr.count; // 重新定义了count不会减1
for(int j = 0; j< count - 1 ;j++)
{
for(int i = j;i < count -1-1-1;i++)
{
NSLog(@"%@ %@",[mArr objectAtIndex:j],[mArr objectAtIndex:i + 2]);
NSString *a = [mArr objectAtIndex:j];
NSString *b = [mArr objectAtIndex:i+2];
if([a isEqualToString:b])
{
[mArr replaceObjectAtIndex:i + 2 withObject:@" "];
}
}
}
return mArr;
}
7........获取一台设备唯一标识的方法有哪些?
http://www.2cto.com/kf/201308/237648.html
MAC地址,udid,keychain
8.....ios 类 是否可以多继承?如果没有,那可以用其他方法实现么?简述实现过程.
不可以,可以通过delegate和protocol来实现类似多继承
9.......堆和栈的区别?
栈区 (stack) --- 由编译器自动分配释放,存放函数的参数值,局部变量的值
堆区 (heap) --- 一般由程序员分配释放
全局区(静态区) (static) -- 全局变量和静态变量.程序结束后由系统释放
文字常量区 ---- 常量字符串存放在这里,程序结束后由系统释放
程序代码区 ---- 存放函数体的二进制文件
栈:只要栈的剩余空间大于所申请空间,系统将为程序提供内存,否则将报异常提示栈溢出
堆:首先应该知道操作系统有一个记录空闲内存地址的链表当系统收到程序的申请时,会遍历该链表,寻找第一个空间大于所申请空间的堆结点,然后将该结点从空闲结点从空闲结点链表中删除,并将该结点的空间分配给程序,另外,对于大多数系统,会在这块内存空间中的首地址处记录本次分配的大小,这样,代码中的delete语句才能正确的释放内存空间.另外由于找到的堆结点的大小不一样正好等于申请的大小,系统会自动的将多余的那部分重新放入到空闲链表中
百度地图
http://alloc.sinaapp.com/wp/?p=344