IOS练习题

本文探讨了Objective-C中的内存管理机制,包括retain、release与dealloc的关系,以及属性关键字的作用。同时,详细解释了线程安全的setter和getter实现,并介绍了类变量的访问权限。此外,还涉及了线程、进程的概念及其区别,iOS中实现多线程的多种方法,以及同步和异步的概念。最后,讨论了iOS设备唯一标识的获取方法和类的继承问题,以及堆和栈的区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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














实现中等难度通讯录。需求: 1、定义联系⼈类Contact。实例变量:姓名(拼⾳,⾸字⺟⼤写)、性别、电话号码、 住址、分组名称、年龄。⽅法:⾃定义初始化⽅法(姓名、电话号码)、显⽰联系⼈信息 2、在main.m中定义字典,分组管理所有联系⼈。分组名为26个⼤写的英⽂字⺟。 3、可以添加联系⼈对象,如果姓名或电话号码为空,添加失败。添加联系⼈到匹配的分 组。 4、获取某个分组名称下所有联系⼈,并且按照姓名升序排列。 5、从通讯录中根据电话号码搜索联系⼈。 6、获取所有⼥性的联系⼈,并且按照年龄的降序排列。 7、根据姓名删除某个联系⼈。 8、删除某个分组的全部联系⼈。 二.处理⼯程⽂件crayons.txt中的⽂本信息,⽂本内容是关于颜⾊的,每⾏都是⼀ 个颜⾊的信息,例如:Almond #EED9C4,前⼀个字符串是颜⾊的名称,后⼀ 个字符串是颜⾊的16进制⾊值,处理⽂本完成如下需求 1、使⽤字典管理所有的颜⾊,即字典中存储的是多个键值对,颜⾊名称为 key,16进制颜⾊值(不带#)是value。 2、取出所有的key,升序排列。 3、取出所有的value,按照排序后的key排列。 4、使⽤⼀个新的字典管理颜⾊,对颜⾊进⾏分类管理,即:“A”,“B”,“C”… 即这个字典包含多个键值对,key是26个字⺟,value是数组,数组⾥存放的是 Color对象(包含name和colorValue)。需要⾃⼰创建Color类。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值