一、#import 和 #include 的区别,@class代表什么?@class 和 #import 的区别?#import<> 和 #import""的区别
答:使用上的区别:
1>、@class 方式一般用在头文件中需要声明该类的某个实例变量的时候用到,在 .m 文件中还需要使用#import;
2>、使用@class方式由于只需要被引用类的名称就行了,而在实现类中由于要使用被引用类中的实例变量和方法,所以需要使用#import来包含被引用类的头文件。
作用上的区别:
#import 会包含引用类的所有信息(内容),包括引用类的变量和方法,而 @class 仅仅是告诉编译器有这么一个类,具体这个类里面有什么信息,则完全不知。
效率上的区别:@class方式不会出现重复编译的问题
在创建对象、继承的时候,使用#import;如果在使用时,只考虑他是一个类而不考虑其中的成员,则建议使用@class。
#import 和 #include相比起来的好处就是不会引起重复包含。#import是OC导入头文件的关键字,#include是C/C++导入头文件的关键字,使用#import头文件会自动只导入一次,不会重复导入,相当于#include 和 #pragma once。
#import<>是用来包含系统的头文件;而#import""用来包含用户头文件的。
二、Objective-C 的内存管理方式及过程
答: 1>、当使用 new,alloc 和 copy 方法创建一个对象的时候,则该对象的保留计数器值为1;当不再使用该对象时,则要负责向该对象发送一条 release 或 autorelease 消息,这样一来,该对象在使用寿命结束时将被销毁;
2>、当通过任何其他方法获得一个对象时,假设该对象的保留计数器值为1,而且已经被设置为自动释放,此时则不需要在执行任何操作来确保该对象被清理;但如果打算在一段时间内拥有该对象,则需要保留它并确保在操作完成时将其释放掉;
3>、如果保留了某个对象,则需要最终释放 或 自动释放该对象,必须保持retain 方法 和 releaser 方法的使用次数相等。
三、Objective-C(以下简称OC)有私有方法吗?私有变量呢?
答:Objective-C 类里面的方法只有两种:静态方法 和 实例方法。按照OO的原则就是一个对象只暴露其有用的东西,如果没有了私有方法,对于一些小范围的代码重用就不那么顺手了。
在类里面声明一个私有方法:
@interface Controller:NSObject { NSString *something;}
+(void)thisIsAStaticMethod;
-(void)thisIsInstanceMethod;
@end
@interface Controller(private)
-(void)thisIsAPrivateMethod;
@end
@private可以用来修饰私有变量
在OC中,所有实例变量默认都是私有的,所有实例方法默认都是公有的。
四、OC的类可以多重继承吗?可以实现多个接口吗?Category是什么?重写一个类的方式时是使用继承好还是使用分类好?为什么?
答:OC的类不可以多重继承;可以实现多个接口,通过实现多个接口可以完成C++ 的多重继承;Category是指类别,一般情况使用分类较好,使用Category重写类的方法,仅对本Category有效,不会影响到其它类与原有类的关系。
五、属性readwrite、readonly、assign、retain、copy、nonatomic各是什么作用?在什么情况下使用?
答:1>.readwrite 是可读可写特性,需要生成 getter 和 setter 方法时使用;
2>.readonly 是只读特性,只会生成 getter 方法,不会生成 setter 方法;当不希望属性在类外发生改变时使用;
3>.assign 是赋值特性,setter 方法将传入参数赋值给实例变量;仅在设置变量使用 assign;
4>.retain 表示持有特性,setter 方法将传入参数先保留,再赋值,传入参数的retainCount 会 +1;
5>.copy 表示赋值特性,setter方法将传入对象复制一份;当需要完全一份新的变量时使用;
6>.nonatomic 是非原子操作,决定编译器生成 setter、getter是否是原子操作,atomic 表示多线程安全,一般使用nonatomic。
六、对于语句 NSString *obj = [[NSData alloc] init];obj在编译时 和 运行时分别是什么类型的对象?
答:编译时是NSString的类型;
运行时是NSData的类型。
七、常见的OC的数据类型有哪些?和 C 的基本数据类型有什么区别?
答: OC 的数据类型有NSString、NSNumber、NSArray、NSMutableArray、NSData 等,这些都是class,创建后便是对象;而 C 的基本数据类型 int,只是一定字节的内存空间,用于存放数值;NSInteger 是基本数据类型,并不是NSNumber 的子类,当然也不是NSObject 的子类。NSInteger 是基本数据类型Int 或者 Long 的别名(NSInteger 的定义:typedef long NSInteger),它的区别在于,NSInteger 会根据系统是32位还是64位来决定其本身是int 还是Long。
八、id 声明的对象有什么特性?
答:id 声明的对象具有运行时的特性,即可以指向任意类型的OC对象。
九、原子操作(atomic) 和 非原子操作(nonatomic) 属性有什么区别?
答:1>.atomic 提供多线程安全,是防止在写操作未完成的时候被另一个线程读取,造成数据错误;
2>.nonatomic 在自己管理内存的环境中,解析的访问器保留并自动释放返回的值,如果指定了 nonatomic,那么访问器只是简单的返回这个值。
十、内存管理的原则是什么?按照默认法则,那些关键字生成的对象需要手动释放?在和property结合时怎样有效的避免内存泄露?
答:1>.谁申请,谁释放;
2>.遵循 Cocoa Touch 的使用原则;
3>.内存管理主要要避免“过早释放” 和 “内存泄露”,对于“过早释放”需要注意@property设置特性时,一定要用对特性关键字;而对于“内存泄露”,一定要申请了就要负责释放,要细心;
4>.关键字 alloc 或 new 生成的对象需要手动释放;
5>.设置正确的property属性,对于retain需要在合适的地方释放。
十一、OC中创建线程的方法?如果在主线程中执行代码,方法是什么?如果要延时执行代码,其方法是什么?
答:线程的三种创建方法:NSThread、GCD的dispatch方法、子类化的NSOperation,然后将其加入NSOperationQueue;在主线程执行代码的方法是:performSelectorOnMainThread ,如果想要延时执行代码可以使用 :performSelector:onThread:withObject:waitUntilDone:
十二、描述iOS SDK中如何实现MVC的开发模式
答:MVC 是模型、视图、控制器开发模式,对于iOS SDK ,所有的View都是视图层的,它应该独立于模型层,由视图控制层来控制。所有的用户数据都是模型层,它应该独立于视图。所有的ViewController都是控制层,由它负责控制视图,访问模型数据。
十三、浅复制 和 深复制的区别:
答:浅层复制:只复制指向对象的指针,而不复制引用对象的本身。
深层复制:复制引用对象本身。
意思就是说我有一个A对象,复制一份后得到A_copy对象后,对于浅复制来说,A 和 A_copy指向的是同一个内存资源,复制的只不过是一个指针,对象本身资源还是只有一份,如果我们对A_copy执行了什么修改操作,则发现A引用的对象同样被修改,这其实违背了我们复制拷贝的一个思想。而深复制就是指内存中存在了两份独立的对象本身。网上有一哥们用一个通俗的例子比喻了深复制和浅复制:
浅复制就好比是你的影子,你完蛋,你的影子也完蛋;
深复制就好比你和你的克隆人,你完蛋,你的克隆人还活着。
十四、类别的作用?继承和类别在实现中有什么区别?
答:1>.类别Category 可以在不获悉、不改变原来代码的情况下往里面添加新的方法,只能添加,不能删除修改;
2>.如果类别和原来类中的方法产生名称冲突时,则类别将覆盖原来的方法,因为类别具有更高的优先级。
3>.类别主要有三个作用:
(1)
原文:http://www.cnblogs.com/zhufengshibei/p/4989607.html