程序员是怎么炼成的---OC题集--练习答案与题目(2)
1、objective-c中有垃圾回收机制吗? 没有像java.C#一样的垃圾回收机制,但是有ARC自动引用计数器技术,根据对象的引用技术来判断对象是否还在使用,如果RC=0,则系统就会销毁对象,实现垃圾回收.
2、简述对内存管理的理解,内存管理的原则,内存管理的实现机制。
1)理解:
每个程序都会使用内存,在需要时分配内存,程序结束时释放占用的内存,如果只分配不释放内存,会造成内存泄露,内存占用增加甚至导致程序崩溃。在oc中,对象不断被创建、使用和销毁,为了不增加额外的内存,必须及时释放。
2)内存管理的原则: 对你自己拥有的对象负责,你只能释放你拥有的对象。
凡是你通过retain、alloc、copy等获得了所有权的对象,都必须在你不再使用它的时候,由你来release、autorelease等手段来释放对它的所有权。
在一定的代码段内,对同一个对象所做的retain、alloc、copy的操作次数应该与 release、autorelease操作的次数相等。
可以在类的dealloc方法中释放你所占有的实例变量。 对于便利构造器和访问器来说,你没有通过retain、alloc、copy获得对象的所有
权,因此在这些情况下你无须对获得对象进行额外的释放操作。 Autorelease只不过意味着“预定延迟发送一条release”,当前引用计数并没有
变。
3)实现机制
为了降低内存开销,需要及时释放不在被使用的对象。但是,需要明确两个问题:
是否有权利释放和什么时候释放。
释放的权利:参照内存管理原则。
释放的时机:对象可以有1个以上的所有者,所有者为0时释放对象。使用“引用计 数(retaincount)”,retaincount的数值根据对象所有者的数目增减,当retaincount=0 时,表示该对象不再被使用,系统释放该对象。
3、简述NSAutoreleasePool的工作机制。
在每一个事件周期(event cycle)的开始,系统会自动创建一个自动释放池;在每一个事件周期的结尾,系统会自动销毁这个自动释放池。一般情况下,你可以理解为:当你的代码在持 续运行时,自动释放池是不会被销毁的,这段时间内你也可以安全地使用自动释放的对象;当你的代码运行告一段落,开始等待用户输入(或者其它事件)时,自动 释放池就会被释放掉,池中的对象都会收到一个release消息,有的可能会因此被销毁。并且,在以下两种情况下,你需要手动建立并手动销毁掉自动释放池: 1.当你在主线程外开启其它线程时:系统只会在主线程中自动生成并销毁掉自动释放池。 2.当你在短时间内制造了大量自动释放对象时:及时地销毁有助于有效利用iPad上有限地内存资源。
当我们向池内发送release消息后,自动释放池就被销毁了.
4、调用一个便利构造器方法创建对象,是否需要释放。
不需要释放,因为便利构造器方法建立的对象已经方法自动释放池里,延迟释放
5、autorelease的对象是在什么时候被release的。
An autorelease pool stores objects that are sent a release message when the pool itself is drained.
当自动释放池被销毁的时候就会全部释放池子中的对象
6、解释(alloc、init、copy、retain、release、autorelease、dealloc, retainCount)定义和在内存管理中的作用。
alloc 创建对象,并把RC设为1 init 初始化对象
copy和retain都使RC的值加1,使用copy的属性必须实现了NSCopying协议
release和autorelease都使RC的值减1,autorelease不会立刻使对象释放,起到延迟释放的作用
dealloc方法是对象被销毁的时候系统调用的方法
retainCount记录RC的值,当retainCount=0时,对象就会被销毁
7、对象的内存是在什么时候被释放的(dealloc方法什么时候会被调用)?
对象内存RC的值为0的时候被释放,当对象被释放的时候dealloc就会被调用.
8、OC中,与alloc语义相反的方法是dealloc还是release?与retain语义相反的方法是dealloc还是release,为什么?需要与alloc配对使用的方法是 dealloc还是release,为什么?
与alloc语义相反的方法是dealloc,因为alloc是创建对象的时候调用的方法,dealloc是销毁对象的时候调用的方法,对RC计数没有影响.与retain相反的方法是release,因为retain使RC值加1,release使RC计数减1;需要与alloc配对使用的方法是dealloc,对象被创建了就需要被销毁.
alloc与dealloc语义相反,创建变量、释放变量; retain与release语义相反,保留引用计数、释放引用计数; alloc与release配对使用,使用alloc给一个对象分配内存,retaincount加1,对象调用release方法,retaincount减1.
10、写一个完整的便利构造器。
-(id)initWithName:(NSString*)name age:(int)age gender:(NSString*)gender adderss:(NSString*)address//初始化方法,供便利构造器使用
{
if (self=[super init]) {
self.name=name;
self.age=age;
self.adderss=address;
self.gender=gender;
}
return self;
}
+(id)PeopleName:(NSString*)name age:(int)age gender:(NSString*)gender adderss:(NSString*)address//便利构造器
{
id obj=[[self alloc] initWithName:name age:age gender:gender adderss:address];
return obj;
}
11、有一个NSStirng类型的,retain方式声明name属性的setter和getter方法
声明部分:
@interface People : NSObject
{
NSString *name;
}
-(void)setName:(NSString *)aname;
-(NSString *)name;
@end
实现部分:
@implementation People
-(void)setName:(NSString *)aname
{
if (name!=aname ) {
[name release];
name= [aname retain];
}
}
-(NSString *)name
{
return name;
}
@end
12、以下每⾏行代码执⾏行后,person对象的retain count分别是多少?
Person *person = [[Person alloc] init]; RC=1
[person retain]; RC=2
[person release]; RC=1
[person release]; RC=0
13、在一个对象的方法里面:self.name = “object”; 和name =”object”
有什么不同吗?
self.name调用了对象里面的setter方法,给对象里面的name赋值,name="object"是给局部变量赋值,二者属于不同变量.
14、-(void)setPeople:(NSString *)p
{self.people = p;
}这段代码有什么问题。
这段代码没有处理内存问题,应该改为
-(void)setPeople:(NSString *)p
{
if(self.people!=p)
{[self.people release];
self.people =[ p retain];}
}
15、for (int i=0;i<largenumber:i++){
Person * p = [Person person]; [p study];
} 这段代码有什么问题,应该怎么去改?//for(int i=0;i<largenumber;i++)
16 、 Aclass *_aclass = [[[[Aclass alloc] init] autorelease] autorelease];解释每次方法执行后的retainCount。
alloc之后为1,autorelease之后为0,再autorelease就会出现野指针错误
17、用c语言写一个冒泡排序(排序的判断条件不是固定的,使用函数指针实现)。
void bubbleSort(int arr[],int n)
{
int *p=arr;int temp;
for (int i=0; i<9; i++) {
for (int j=0; j<9-i; j++) {
if (*(p+j)>*(p+j+1)) {
temp=*(p+j);
*(p+j)=*(p+j+1);
*(p+j+1)=temp;
}
}
}
}
18、用预处理指令#define声明一个常数,用以表明1年中有多少秒(忽略闰年问题)
#define DAYSOFYEAR (365*24*60*60)
19、写一个"标准"宏MIN ,这个宏输入两个参数并返回较小的一个。
#define MIN (a)>(b)?(b):(a)
oc练习
1,(1)截取字符串”20 | http://www.baidu.com”中,”|”字符前面和后面的数据,分别
输出
NSString *str=@"20|http://www.baidu.com";
NSArray *arr= [NSArray array];
arr= [str componentsSeparatedByString:@"|"];
NSLog(@"%@",arr);
}
(2)从字符串@“aBcD_EfGk”中取出EfGk,并让大写字母转成小写,输出efgk
NSString *str=@"aBcD_EfGk";
str=[str lowercaseString];
NSArray *arr= [NSArray array];
arr= [str componentsSeparatedByString:@"_"];
NSLog(@"%@",arr[1]);
(3)给定一个字符串,判断字符串中是否含有“png”,如果有就删除。
NSString *str=@"abcdefdpngcdd";
str=[str stringByReplacingOccurrencesOfString:@"png" withString:@""];
NSLog(@"%@",str);
(4)如何将敏感字变成** 使用字符串替换函数:stringByReplacingOccurrencesOfString:withString:
(5)OC中的数字对象都有哪些,列出数据类型,选择任意一种数据类型创建数字对象。
NSNumber是Objective-c的数字对象,相当于将一个数字包装为一个对象
NSNumber*number=[NSNumber numberWithInt:123];//将int转换成NSNumber
int a=[number intValue];//得到int类型的值
(6)NSRange是什么数据类型,成员变量有哪些,都有什么作用?NSRange和 NSString怎么相互转换。
结构体数据类型,成员变量包括location,length.location决定位置,length决定长度,原型如下:
typedef struct _NSRange {
NSUInteger location;
NSUInteger length;
} NSRange;
NSRange和 NSString相互转换:
NSRange ran=NSMakeRange(12, 32); NSLog(@"%@",NSStringFromRange(ran));
NSRangeFromString(@"2,3");
(7)数组有什么特点?
1. 数组元素依次存放,使用连续的内存
2. 数组名为常量指针
3. sizeof(数组名) 表示数组所占的内存字节数
程序员是怎么炼成的---OC题集--练习答案与题目(2)的更多相关文章
- 程序员是怎么炼成的---OC题集--练习答案与题目(1)
一. 1. 定义3个类,全部代码.效果:能默写,关键词全部正确. 2. ⾯面向对象和⾯面向过程有什么区别? 答:面向对象以事物(对象)为核⼼,完成事件只是一个任务.面向过程以事件为核心,为了完成任务, ...
- 程序员是怎么炼成的---OC题集--练习答案与题目(3)
1.init 2.initWithBytes:length:encoding: 3.initWithCharacters:length: 4.initWithCString:encoding: 5.i ...
- Android程序员提加薪被拒,刷2000题跳槽涨薪50%!
为什么想跳槽? 简单说一下当时的状况,我在这家公司做了两年多,这两年多完成了一个大项目,作为开发的核心主力,开发压力很大,特别是项目上线前的几个月是非常辛苦,几乎每晚都要加班到12点以后,周末最多只有 ...
- 打杂程序员之ftp换成外网ip咋就登陆不上?
主动模式ftp N连接到ftp的21端口.然后客户端开端口监听,并通过N+1端口发送命令给FTP服务器.服务器反过来连接用户本地端口. 被动模式解决从服务器到客户端数据端口的入口反向连接被防火墙过滤掉 ...
- .net程序员面试小结(内附一些面试题和答案)
今天下午去面试,面试官和HR小姐姐都很好,没有做面试题,用聊天的方式来交流技术,整个过程很轻松,从中也学到了很多知识. 下面就来总结一下面试过程. 一.深刻了解自己的简历 无论是HR还是技术面试人,首 ...
- Android程序员学WEB前端(5)-HTML(5)-框架集-Sublime
转载请注明出处:http://blog.csdn.net/iwanghang/article/details/76576279 觉得博文有用,请点赞,请评论,请关注,谢谢!~ 框架集: index7. ...
- JAVA程序员面试宝典
程序员面试之葵花宝典 面向对象的特征有哪些方面 1. 抽象:抽象就是忽略一个主题中与当前目标2. 无关的那些方面,3. 以便更充分地注意与当前目标4. 有关的方面.抽象并不5. 打算了解全部问题 ...
- Java程序员面试之葵花宝典
程序员面试之葵花宝典 1.面向对象的特征有哪些方面 抽象:抽象就是忽略一个主题中与当前目标 无关的那些方面, 以便更充分地注意与当前目标有关的方面.抽象并不打算了解全部问题,而 只是选择其中的一部 ...
- SOHO 程序员
SOHO 程序员:从事程序开发.维护的家居办公人员. 一.自由程序员 SOHO程序员代表一种自由.弹性而新型的工作方式.SOHO,代表一种新经济.新概念. 是一些热爱软件开发的一族. SOHO程序员 ...
随机推荐
- Java 集合系列 07 List总结(LinkedList, ArrayList等使用场景和性能分析)
java 集合系列目录: Java 集合系列 01 总体框架 Java 集合系列 02 Collection架构 Java 集合系列 03 ArrayList详细介绍(源码解析)和使用示例 Java ...
- oracle 里面定时执行任务,比如存储过程内容等
DECLARE job_no_ NUMBER; BEGIN DBMS_JOB.SUBMIT(job_no_, 'proc_qszx_dw_sc(' ...
- Floyd 算法的动态规划本质
[转载自:http://www.cnblogs.com/chenying99/p/3932877.html] Floyd–Warshall(简称Floyd算法)是一种著名的解决任意两点间的最短路径(A ...
- 用户上网的基本流程图与DNS解析原理
1.用户上网发送请求,首先确认本地的hosts中是否含有域名,有则进行ip访问,如果没有呢?看本机的display缓存中有没有访问网站的ip,有就直接去访问 那么如果本地的hosts和缓存都没有呢?这 ...
- spring mvc环境配置
spring mvc将所有的请求都经过一个servlet控制器-DispatcherServlet,这个servlet的工作就是将一个客户端的request请求分发给不同的springmvc控制器,既 ...
- Flume Hello World!
Flume 是 Cloudera 公司开源出来的一套日志收集系统.模型如下所示: 图中Source,Sink分别代表数据源和数据目的地,channel表示Source和Sink之间的通道.配置文件为/ ...
- Uploadify使用
Uploadify是JQuery的一个上传插件,实现的效果非常不错,带进度显示.不过官方提供的实例时php版本的,本文将详细介绍Uploadify在Aspnet中的使用,您也可以点击下面的链接进行演示 ...
- bzoj 1834: [ZJOI2010]network 网络扩容
#include<cstdio> #include<iostream> #include<cstring> #define M 100000 #define inf ...
- 青蛙跳台阶(Fibonacci数列)
问题 一只青蛙一次可以跳上 1 级台阶,也可以跳上2 级.求该青蛙跳上一个n 级的台阶总共有多少种跳法. 思路 当n=1时,只有一种跳法,及f(1)=1,当n=2时,有两种跳法,及f(2)=2,当n= ...
- println与toString()
public class Test{ public static void main(String[] args) { Mankind mk=new Mankind(); System.out.p ...