AI智能
改变未来

IOS面试相关

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

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

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

Alloc

Init

Copy

Retain

Release

Autorelease

Dealloc

 

19. 说出你对内存管理的理解(提示:1,解释你知道的内存管理关键字,2,属性的内存管理方法,3,自动释放池和autorelease,4便利构造器的实现思路)(同问题:简述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设置特性时,一定要用对特性关键字,对于“内存泄漏”,一定要申请了要负责释放,要细心。

关键字alloc 或new 生成的对象需要手动释放;

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

 

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

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]);  

答:

str的retainCount创建+1,retain+1,加入数组自动+1   3

retain+1,release-1,release-1                                             2

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

 

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

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

 

23. 什么是安全释放?

 

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

 

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

 

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

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

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

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

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

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

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

    NSMutableArray *aArray = [NSMutableArray array];

    [aArray addObject:aStr];

    NSLog(@”ref=%d”, [aStrretainCount]);

 

31.内存泄露怎么处理?

 

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

 

 

 

 

 

 


 

 

 

 

第10章 KVC,KVO

 

1.     Key-Value Coding是什么?

 

2.     KVO在objc中是怎么实现的?

 

3.     What are KVO andKVC?
什么是KVC和KVO?

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


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

[cpp]

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


#pragma mark KVO 
 


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


   if ([keyPathisEqualToString:@\”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. KVC和KVO有什么特性?

 

 

第11章 通知

 

1.     notification 和KVO有什么不同?

 

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

 

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

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

 

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

 

 

第12章 类的扩展

 

1.写一个委托的interface。

 

2.写一个NSString类的实现

+(id)initWithCSting:(const char *)nullTerminatedCStringencoding:(NSStringEncoding)encoding;

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

{

}

 

3. 单件实例是什么?

 

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

 

5. delegate和notification区别,分别在什么情况下使用?

 

6. self.跟self什么区别?

 

7. id、nil代表什么?

 

8. 类别的作用?

 

9. 委托(举例)

 

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

 

11. 写一个singleton(单例)

 

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

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

 

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

 

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

 

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

 

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

 

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

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

 

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

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

 

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

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


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


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


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

 

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

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

 

22. DELEGATE的理解 

 

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

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

 

 

 

 

 

第13章 常用数据类型

1.

void*getNSString(const NSString*inputString)

{

   inputString=@\”This isa main testn\”;

   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. 为什么很多内置的类,如TableViewController的delegate的属性是assign不是retain?

5. 定义属性时,什么情况使用copy、assign、retain?

6. SEL 是什么类型呢?

7. GBK 如何转换为 UTF-8
8. sizeof与strlen的区别和联系?
9. 解释NSArray、NSMutableArray

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

        NSArray array = [NSArrayarrayWithObjects:@\”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 = [[NSDataalloc] init]; obj在编译时和运行时分别时什么类型的对象?

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

 

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

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

 

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

 

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

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


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

 

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

        NSDictionary *dict = [NSDictionary dictionaryWithObject:@\”a stringvalue\” 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.     怎么样实现一个 MemoryCache

4.     什么叫做数据结构?

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

第16章 网络连接

 

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

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

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

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

  • 点赞
  • 收藏
  • 分享
  • 文章举报

tianlong9226发布了1 篇原创文章 · 获赞 0 · 访问量 346私信关注

赞(0) 打赏
未经允许不得转载:爱站程序员基地 » IOS面试相关