iOS最新面试题2【经典】

14. objective - c的内存管理方式,NSAutoreleasePool的作用
15. 写一个retain方式声明属性的setter方法
16. 谈谈对内存的理解

17. 分析Aclass *_aclass = [[[[Aclass alloc] init] autorelease] autorelease];

18. 说说下面关键词在内存管理的作用及内存管理的原

Alloc

Init

Copy

Retain

Release

Autorelease

Dealloc

 

19. 说出你对内存管理的理解(提示:1,解释你知道的内存管理关键字,2,属性的内存管理方法,3,自动释放池和autorelease4便利构造器的实现思路)(同问题:简述objective-C的内存管理)

:Objective-C的内存管理主要有三种方式ARC(自动内存计数)、手动内存计数、内存池。

1)关键字(及何时使用):

readwrite 是可读可写特性;需要生成getter方法和setter方法时

readonly 是只读特性  只会生成getter方法 不会生成setter方法 ;不希望属性在类外改变

assign 是赋值特性,setter方法将传入参数赋值给实例变量;仅设置变量时;

retain 表示持有特性,setter方法将传入参数先保留,再赋值,传入参数的retaincount+1;

copy 表示赋值特性,setter方法将传入对象复制一份;需要完全一份新的变量时。

nonatomic 非原子操作,决定编译器生成的setter getter是否是原子操作,atomic表示多线程安全,一般使用nonatomic

2),属性的内存管理方法

3),自动释放池和autorelease

4),便利构造器的实现思路

 

 

20. 内存管理的几条原则是什么?按照默认法则.哪些关键字生成的对象需要手动释放?在和property结合的时候怎样有效的避免内存泄露?

: 谁申请,谁释放

遵循Cocoa Touch的使用原则;

内存管理主要要避免“过早释放”和“内存泄漏”,对于“过早释放”需要注意@property设置特性时,一定要用对特性关键字,对于“内存泄漏”,一定要申请了要负责释放,要细心。

关键字allocnew 生成的对象需要手动释放;

设置正确的property属性,对于retain需要在合适的地方释放,

 

21. 看下面的程序,第一个NSLog会输出什么?这时strretainCount是多少?第二个和第三个呢? 为什么?

NSMutableArray* ary [[NSMutableArray array] retain];  

NSString *str [NSString stringWithFormat:@"test"];  

[strretain];  

[aryaddObject:str];  

NSLog(@"%@%d",str,[str retainCount]);  

[strretain];  

[strrelease];  

[strrelease];  

NSLog(@"%@%d",str,[str retainCount]);  

[aryremoveAllObjects];  

NSLog(@"%@%d",str,[str retainCount]);  

:

strretainCount创建+1retain+1,加入数组自动+1    3

retain+1release-1release-1                                               2

数组删除所有对象,所有数组内的对象自动-1    

 

22. 浅复制和深复制的区别?Difference between shallow copy and deep copy?

答案:浅层复制:只复制指向对象的指针,而不复制引用对象本身。深层复制:复制引用对象本身。意思就是说我有个A对象,复制一份后得到A_copy对象后,对于浅复制来说,AA_copy指向的是同一个内存资源,复制的只不过是是一个指针,对象本身资源还是只有一份,那如果我们对A_copy执行了修改操作,那么发现A引用的对象同样被修改,这其实违背了我们复制拷贝的一个思想。深复制就好理解了,内存中存在了两份独立对象本身。用网上一哥们通俗的话将就是:浅复制好比你和你的影子,你完蛋,你的影子也完蛋深复制好比你和你的克隆人,你完蛋,你的克隆人还活着。

 

23. 什么是安全释放?

 

24.为什么有些4.0独有的objectivec 函数在3.1上运行时会报错.4.0独有的类在3.1上分配内存时不会报错?分配的结果是什么?

 

25. 为什么4.0独有的c函数在3.1的机器上运行不会报错(在没有调用的情况下?)而4.0独有的类名在3.1的机器上一运行就报错?

 

26.自动释放池跟GC(垃圾回收)有什么区别?iPhone上有GC么?[pool release] 和[pool drain]有什么区别?

:iPhone上没有GCiPhone开发的时候没有垃圾回收机制。
在垃圾回收环境中,release是一个空操作。因此,NSAutoreleasePool提供了drain方法,在引用计数环境中,该方法的作用等同于调用release,但在垃圾回收环境中,它会触发垃圾回收(如果自上次垃圾回收以来分配的内存大于当前的阈值)。因此,在通常情况下,您应该使用drain而不是release来销毁自动释放池。

27. for(int index = 0; index < 20; index ++){
NSString *tempStr = @
tempStr;
NSLog(tempStr);
NSNumber *tempNumber = [NSNumber numberWithInt:2];
NSLog(tempNumber);
}
这段代码有什么问题.?会不会造成内存泄露(多线程)?在内存紧张的设备上做大循环时自动释放池是写在循环内好还是循环外好?为什么?

28.在一个对象释放前.如果他被加到了notificationCenter.不在notificationcenterremove这个对象可能会出现什么问题?

29. 什么是序列化或者Acrchiving,可以用来做什么,怎样与copy结合,原理是什么?.

30. 写出下面程序段的输出结果

     NSString *aStr = [[[NSString alloc] initWithString:@Hello World] autoRelease];   

     NSMutableArray *aArray = [NSMutableArray array];

     [aArray addObject:aStr];

     NSLog(@ref=%d, [aStr retainCount]);

 

31.内存泄露怎么处理?

 

32. 分别叙述strong weak retain release alloc 的用法 

 

 

 

 

 

 





 

 

 

 

10KVC,KVO

 

1.      Key-Value Coding是什么?

 

2.      KVOobjc中是怎么实现的?

 

3.      What are KVO and KVC?
什么是KVCKVO?

答案:kvc:- 值编码是一种间接访问对象的属性使用字符串来标识属性,而不是通过调用存取方法,直接或通过实例变量访问的机制。

很多情况下可以简化程序代码。apple文档其实给了一个很好的例子。kvo:键值观察机制,他提供了观察某一属性变化的方法,极大的简化了代码。具体用看到嗯哼用到过的一个地方是对于按钮点击变化状态的的监控。比如我自定义的一个button

[cpp]

[self addObserver:self forKeyPath:@"highlighted" options:0 context:nil];

#pragma mark KVO

-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {

   if ([keyPath isEqualToString:@"highlighted"] )   

{ [self setNeedsDisplay]; } }
对于系统是根据keypath去取的到相应的值发生改变,理论上来说是和kvc机制的道理是一样的。

对于kvc机制如何通过key寻找到value“当通过KVC调用对象时,比如:[self valueForKey:@someKey]时,程序会自动试图通过几种不同的方式解析这个调用。首先查找对象是否带有 someKey 这个方法,如果没找到,会继续查找对象是否带有someKey这个实例变量(iVar),如果还没有找到,程序会继续试图调用 -(id) valueForUndefinedKey:这个方法。如果这个方法还是没有被实现的话,程序会抛出一个NSUndefinedKeyException异常错误。 (cocoachina.com注:Key-Value Coding查找方法的时候,不仅仅会查找someKey这个方法,还会查找getsomeKey这个方法,前面加一个get,或者_someKey以及_getsomeKey这几种形式。同时,查找实例变量的时候也会不仅仅查找someKey这个变量,也会查找_someKey这个变量是否存在。)

设计valueForUndefinedKey:方法的主要目的是当你使用-(id)valueForKey方法从对象中请求值时,对象能够在错误发生前,有最后的机会响应这个请求。这样做有很多好处,下面的两个例子说明了这样做的好处。“来至cocoa,这个说法应该挺有道理。因为我们知道button却是存在一个highlighted实例变量.因此为何上面我们只是add一个相关的keypath就行了,可以按照kvc查找的逻辑理解,就说的过去了。


4. KVCKVO有什么特性?

 

 

11章 通知

 

1.      notification KVO有什么不同?

 

2.      简述Notification的工作机制和使用方法。

 

3.         通知和协议的不同之处?(what is difference between NSNotification and protocol?)

答案:协议有控制链(has-a)的关系,通知没有。首先我一开始也不太明白,什么叫控制链(专业术语了~)。但是简单分析下通知和代理的行为模式,我们大致可以有自己的理解简单来说,通知的话,它可以一对多,一条消息可以发送给多个消息接受者。代理按我们的理解,到不是直接说不能一对多,比如我们知道的明星经济代理人,很多时候一个经济人负责好几个明星的事务。只是对于不同明星间,代理的事物对象都是不一样的,一一对应,不可能说明天要处理A明星要一个发布会,代理人发出处理发布会的消息后,别称B发布会了。但是通知就不一样,他只关心发出通知,而不关心多少接收到感兴趣要处理。因此控制链(has-a从英语单词大致可以看出,单一拥有和可控制的对应关系。

 

4.       notification是同步还是异步? kvo是同步还是异步?notification是全进程空间的通知吗?kvo呢?

 

 

12章 类的扩展

 

1.写一个委托的interface

 

2.写一个NSString类的实现

+idinitWithCSting:(const char *)nullTerminatedCString encoding:(NSStringEncoding)encoding;

+(id)stringWithCString:(const char *)nullTerminatedCString encoding:(NSStringEncoding)encoding;

{

}

 

3. 单件实例是什么?

 

4.   Object-C有私有方法吗?私有变量呢?

 

5. delegatenotification区别,分别在什么情况下使用?

 

6. self.self什么区别?

 

7. idnil代表什么?

 

8. 类别的作用?

 

9. 委托(举例)

 

10. @class#import,#include的区别  

 

11. 写一个singleton(单例)

 

12. object-c中有没有多承?多承的好catagary是什么?

13. 代理是什么?代理中的属性用什么关?

 

14.Protocol performSelector: 的相同与区别,哪个更好(基础参数类型传递)

 

15. 不使用继承,为NSStirng类添加新方法 myPrint

 

16.通常类目只能为一个已知类添加方法,但是有些特殊情况需要为已知类添加一个属性,请写出解决方案。

 

17. 手写一个代理,并实现代理方法(考核点为代理的语法和注意事项,具体变量名,类名,代理名,自定义)。

 

18. 类别的作用?继承和类别在实现中有何区别?(What is advantage of categories? What is difference between implementing a category and inheritance?)

答案:category 可以在不获悉,不改变原来代码的情况下往里面添加新的方法,只能添加,不能删除修改。并且如果类别和原来类中的方法产生名称冲突,则类别将覆盖原来的方法,因为类别具有更高的优先级。类别主要有3个作用:(1)将类的实现分散到多个不同文件或多个不同框架中。(2)创建对私有方法的前向引用。(3)向对象添加非正式协议。 继承可以增加,修改或者删除方法,并且可以增加属性。

 

19.类别和类扩展的区别。(Difference between categories and extensions?)

答案:categoryextensions的不同在于后者可以添加属性。另外后者添加的方法是必须要实现的。extensions可以认为是一个私有的Category

 

20. obc中的协议和java中的接口概念有何不同?(Difference between protocol in objective c and interfaces in java?)

答案:OC中的代理有2层含义,官方定义为formalinformal protocol。前者和Java接口一样。informal protocol中的方法属于设计模式考虑范畴,不是必须实现的,但是如果有实现,就会改变类的属性。

其实关于正式协议,类别和非正式协议我很早前学习的时候大致看过,也写在了学习教程里“非正式协议概念其实就是类别的另一种表达方式“这里有一些你可能希望实现的方法,你可以使用他们更好的完成工作”。

这个意思是,这些是可选的。比如我门要一个更好的方法,我们就会申明一个这样的类别去实现。然后你在后期可以直接使用这些更好的方法。这么看,总觉得类别这玩意儿有点像协议的可选协议。"

现在来看,其实protocal已经开始对两者都统一和规范起来操作,因为资料中说“非正式协议使用interface修饰“,现在我们看到协议中两个修饰词:“必须实现(@requied)”和“可选实现(@optional)”。

 

21. 代理的作用?(What is purpose of delegates?)

答案:代理的目的是改变或传递控制链。允许一个类在某些特定时刻通知到其他类,而不需要获取到那些类的指针。可以减少框架复杂度。另外一点,代理可以理解为java中的回调监听机制的一种类似。

 

22. DELEGATE的理解 

 

23. 委托是什么?委托的property声明用什么属性?为什么?

: 委托:IOS中委托通过一种@protocol的方式实现,所以又称为协议.协议是多个类共享的一个方法列表,在协议中所列出的方法没有响应的实现,由其它人来实现.这叫好比我想买个手机,所以我有个buyIphone 方法,但是我不知道谁那买手机,所以把这个需求发布出去(比如公布在网站上),如果有卖手机的商人(也就是说他能实现buyIphone这个方法)看到,他就会接受我的委托,(在商人自己的类中实现),那么我的委托对象就指向了这个商人..当我要买手机的时候,直接找他就行了.

 

 

 

 

 

13章 常用数据类型

1.

void*getNSString(const NSString*inputString)

{

    inputString=@"This is a main test\n";

    return;

}

int main(intargc,const char*argv[])

{

    NSString*a=@"Main";

    NSString*aString=[NSString stringWithString:@"%@",getNSString(a)];

    NSLog(@"%@\n",aString);

}

最后输出的字符串是:_________________.

2.readwrite,readonly,assign,retain,copy,nonatomic属性的作用

3.sprintf,strcpy,memcpy的功能,在使用上有哪些要注意的地方。

4. 为什么很多内置的类,如TableViewControllerdelegate的属性是assign不是retain

5. 定义属性时,什么情况使用copyassignretain

6. SEL 是什么型呢?

7. GBK 如何转换为 UTF-8
8. sizeofstrlen的区别和联系?
9. 解释NSArrayNSMutableArray

10.写出下面程序段的输出结果

         NSArray array = [NSArray arrayWithObjects:@"one",@"two",@"three",nil];

         NSLog(@"@", [array objectAtIndex:1]);

         NSLog(@"%@", [array objectAtIndex:3]);

char * a = iPhone;
char b[] =
iPhone;
*(a++) =
1;
*(b++) =2:
这段代码是否能正确运行,如果不能,简述理由。

 

11. 对于语句NSString*obj = [[NSData alloc] init]; obj在编译时和运行时分别时什么类型的对象?

: 编译时是NSString的类型;运行时是NSData类型的对象

 

12. 常见的object-c的数据类型有那些, 和C的基本数据类型有什么区别?如:NSIntegerint

: object-c的数据类型有 NSStringNSNumberNSArrayNSMutableArrayNSData等等,这些都是class,创建后便是对象,而C语言 的基本数据类型int,只是一定字节的内存空间,用于存放数值;而object-cNSNumber包含有父类NSObject的方法和 NSNumber自己的方法,可以完成复杂的操作。

 

13.给定的一个字符串,判断字符串中是否还有png,有就删除它

 

14.obc中可修改和不可以修改类型。(What are mutable and immutable types in Objective C?)

答案:可修改不可修改的集合类。这个我个人简单理解就是可动态添加修改和不可动态添加修改一样。

比如NSArrayNSMutableArray。前者在初始化后的内存控件就是固定不可变的,后者可以添加等,可以动态申请新的内存空间。

 

15. 写出下面程序段的输出结果

         NSDictionary *dict = [NSDictionary dictionaryWithObject:@"a string value" forKey:@"akey"];         NSLog(@"%@", [dict objectForKey:@"akey"]);

         [dict release];

16.  1hello 2word 3good 分别存入数组 把单词首字符作为key 后面的部分作为value

17. 给你一个字符串 helloword hello后插入my

 

 

 

 

 

 

14章 日期

 

1. timer的间隔周期准吗?为什么?怎样实现一个精准的timer?

 

15章 文件与数据

1.      怎么在xcode中查找堆栈

2.      详细介绍下栈,堆,队列

3.      怎么样实现一个 Memory Cache

4.      什么叫做数据构?

5.      程中,保存数据有哪几种方式?


16章 网络连接

 

1. objective - c中是如何实现线程同步的?

2. Object C中创建线程的方法是什么?如果在主线程中执行代码,方法是什么?如果想延时执行代码、方法又是什么?

答案:线程创建有三种方法:使用NSThread创建、使用 GCDdispatch、使用子类化的NSOperation,然后将其加入NSOperationQueue;在主线程执行代码,方法是 performSelectorOnMainThread,如果想延时执行代码可以用performSelector:onThread:withObject:waitUntilDone:

3. 怎么利用HTTP链接取图片

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博沟通,第一时间进行解答!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值