Objective-C面试题

1, OC中输出函数是什么?如何输出一个字符串?
   输出函数是NSLog();输出字符串NSLog(@“hello world”);

2, OC中的对象和指针有什么区别?
   oc中的对象都是指针

3, #import 和#include的区别,@class?
答:#import自动防止重复包含#include不能,@class前向声明

5, OC头文件和源文件后缀名分别是什么?
   头文件.h  源文件.m

6, C++中有普通成员变量和静态成员变量,OC中有没有对应的变量,称之为什么?
   C++中的普通成员函数和静态成员函数对应OC中的什么方法?
   oc中有普通的成员变量但没有静态成员变量,在.m文件中使用静态全局变量达到c++中静态成员变量的效果。
   c++中普通成员函数对应oc中的实例方法,静态成员函数对应oc中的类方法。

7, OC有没有多重继承?OC中的根类是什么?根类中有哪些方法是常用的?
   oc中没有多重继承,oc中的根类是NSObject,根类中常用的方法有alloc方法、init方法

8, C++中的函数调用在OC是另外一种称谓,是什么?
   oc中是向对象发送消息

9, OC中的函数重载和C++函数重载的区别是什么?
   c++中函数重载要求参数列表不一样,oc中参数重载要求标签不一样。

10, 在OC类的.h文件中为什么要声明@propery(nonatomic)int x;
    给x成员声明实现set方法和get方法
    
11, nonatomic的作用是什么
    禁止多线程保护,节省开销(非原子化操作)
 
12, - (id)initWithName:(NSString*)n
{
    if(self = [super init])
    {
        name = n;
    }
}

- (id)initWithName:(NSString*)n
{
    if(self = [super init])
    {
        self.name = n;
    }
}
有什么区别? 为什么要在name赋值时加self. ?
   前者不会调用set方法,加self.会调用@property声明的set方法;
   给对象成员赋值时需要调用property属性对该对象成员的引用计数加1。

13, 什么是retaincount,什么时候对象的retainCount会增加
    引用计数器(可以写内存管理),alloc,retain,copy,对象被引用(加入到数组中等)

14, 自动释放池是什么,如何工作
答:自动释放池即NSAutoreleasePool,当向对象发送autorelease消息时,对象的引用加入到自动释放池中,当自动释放池对象发送drain消息时,池中的所有对象被真正销毁。

15, 一个程序中只有一个自动释放池吗
    不是,一个事件周期开始,系统会自动创建一个自动释放池
每个事件周期结束,系统会自动销毁这个自动释放池,代码运行的时候,自动释放池不会被销毁,这段时间内可以安全的使用autorelease对象,当代码运行告一段落,开始等待用户事件(如:输入等事件)自动释放池会被释放掉,池中的对象便会受到release消息,有可能由此被销毁

16, 简述Objective-C的内存管理
    Objective-c使用reference count(引用计数器)来管理内存,对象alloc时引用计数器变为1,copy,retain时引用计数器也会加1,对象发送release消息时,引用计数器减1,当引用计数器为0时,对象对被真正销毁。对于类的实例变量赋值时如果变量不是被显式地alloc出来的需要在property中使用retain或copy并且用self.var = xxx赋值,同时在dealloc方法中释放该实例变量。
    还一个是NSAutoreleasePool(自动释放池)

17, OC中的assign,retain,copy有什么区别,@property中什么情况下会使用assign, retain或copy?
    assign是对基本数据类型的赋值,
    retain会release旧对象然后指向新对象并对新对象应用计数加1,
    copy会release旧对象然后指向新对象的拷贝并将该拷贝的对象引用计数加1;
    基本数据类型使用assign,拷贝对象时使用copy,引用某个对象时使用retain。

18, 这段代码有什么问题吗:
    @implementation Person
    - (void)setAge:(int)newAge
    {
     self.age = newAge;
    }
    死循环,self.会调用set方法,自己调用自己

19, [origin release]和self.origin=nil;两者有什么区别?
    [origin release]是将origin引用计数减1。
    self.origin=nil;是将该指针指向空。



20, property中使用retain和copy时,系统生成 的set方法是怎样的?
retain: 需要先判断两个指针对象是否已经指向同一块空间
    -(void)setMyObject:(id)thing
{
    if(myObject != thing)
{
    [myObject release];
    myObject = [thing retain];
}
}
copy:
    -(void)setMyObject:(id)thing
{
    [myObject release];
    myObject = [thing retain];
}

 
21, OC空指针和c++空指针的区别
    OC空指针发送消息是合法的,消息被忽略,不响应;C++空指针调用方法崩溃

22, Objective-C有私有方法么?私有变量呢
    在Objective-C中没有私有方法,只有静态方法和实例方法。但是可以用@private修饰私有变量

23, Objective-C有多重继承么?不是的话有什么替代方法?
    Objective-c没有多重继承,用协议和分类来代替


24, OC中能不能用指向子类的父类指针调用到被子类覆盖的父类方法?
    不能 OC中所有的方法都是虚方法

25, 写一个协议(委托)的interface
     @protocol MyDelegate
     -(void)didSomething:(NSString*)thing;
     @end

    @interface MyClass :NSObject
    {
        id <MyDelegate> delegate;
    }
    @end

26, OC中的协议有什么特点?协议有什么作用?
    协议不是类,协议声明的方法不需要立即被实现而是需要遵守该协议的类去实现。
    协议的作用类似于c++中抽象基类的作用。


27, 写一个NSString的分类
#import<Fundaton/Fundation.h>
@interface NSString(NSStringExpandMathod)

-(void)addMathod;
@end

@implementation NSString(NSStringExpandMathod)
-(void)addMathod{
//do something
}
@end

28, OC中的分类有什么特点?分类有什么好处?
    分类是在类的声明之外对该类扩展方法的类,该类只能扩展方法不能扩展成员变量,一个类可以有多个分类但每个分类必须是唯一的。
    分类的好处可以给原有的类扩展新的成员方法

29, OC异常处理和C++的区别
        1,只能抛出对象 2,finally

 
30,  Objective-C的优缺点
优点:
  1) 分类
  2) 协议
  3) 动态识别
  4) Objective-C 与 C++ 可混合编程
缺点:
  1)  不支援命名空间
  2)  不支持运算符重载
  3) 不支持多重继承


31, OC和C++的区别(至少5点)
    1,多继承
    2,分类
    3,运算符重载
    4,友元
    5,内联    
 

33, NSNumber对象是用于处理数字对象,那么NSNumber* number = [NSNumber numberWithInt:10];和
NSNumber* number = [[NSNumber alloc]initWithNumber:10];有什么区别?
numberWithInt是类方法,initWithNumber是实例方法,类方法创建的对象是autorelease的。

33, 如何比较两个字符串对象?
    直接调用字符串的实例方法 compare方法

34, 可以直接把int、float等简单类型加入数组中么?
    不可以,数组中只能放对象,需要把int和float等基本数据类型转换成NSNumber对象再放到数组中。

35, 举例说明,如何对数组元素快速遍历?
    for (id element in array) {
        NSLog(@“%@“,element);
    }

36, 举例说明,对数组元素排序应该如何实现?
    [anArray sortedArrayUsingSelector:@selector(compareMethod:)];
    -(NSComparisonResult) compareMethod: (id) element;

37, 字典是有序集合还是无序集合?
    无序集合

38 如何获取字典中的所有键,那又如何获得所有的值呢?
    [aDictionary allKeys];
    [aDictionary allValues];
 
39, 截取字符串”20|http://www.621life.com“ 中 ‘|’字符前面及后面的数据,分别输出它们
NSArray* array = [@”20|http://www.621life.com” componentsSeparatedByString@”|”];分割字符串

 
40, 如何实现数据持久化保存
    1,数据归档(写入沙盒中)2,SQlite数据库 3,NSUserDefault
附:数据归档方法,NSKeyedArchive,[string writeToFile…]等

41, 如何清空一个可变字符串
    [str setString:@””];注意是清空,不能是str = nil,str=@””;

42, NSFileManager有哪些功能?
    Creat,copy,move,fileExist...
 
43, 如何判断指定路径的文件是否存在,如何拷贝文件,如何删除文件,请举例说明?
    NSFileManager *fm = [NSFileManager defaultManager];
        if (![fm fileExistsAtPath:toPath]) {
            [fm copyItemAtPath:fromPath toPath:toPath error:nil];
        }
    [fm removeItemAtPath:fromPath error:nil];

44, 单件实例是什么
单例模式的意图是是的类的对象成为系统中唯一的实例,提供一个访问点,供客户类共享资源。整个程序中只会有一个这个类的实例(对象)产生,所有对象的地址是一样的
static MyClass *class = nil;
+(MyClass *)shareMyClass{
    @synchronized (self)//为了确保多线程情况下,仍然确保实体的唯一性
    {
        if (!class){
            [[self alloc]init];
        }
    }
  return class;}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值