面试iOS笔试面试iOS面试题

可能碰到的iOS笔试面试题(5)--Objective-C

2016-04-30  本文已影响3284人  b485c88ab697

面试笔试都是必考语法知识的。请认真复习和深入研究OC。

Objective-C

方法和选择器有何不同?(Difference between method and selector?)

Core Foundation的内存管理

malloc和New的区别

你是否接触过OC中的反射机制?简单聊一下概念和使用

什么是SEL?如何声明一个SEL?通过那些方法能够,调用SEL包装起来的方法?

协议中<NSObject>是什么意思?子类继承了父类,那么子类会遵守父类中遵守的协议吗?协议中能够定义成员变量?如何约束一个对象类型的变量要存储的地址是遵守一个协议对象?

NS/CF/CG/CA/UI这些前缀分别是什么含义

面向对象都有哪些特征以及你对这些特征的理解。

我们说的Objective-C是动态运行时语言是什么意思? (When we call objective c is runtime language what does it mean?)

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

简述NotificationCenter、KVC、KVO、Delegate?并说明它们之间的区别?(重点)

懒加载(What is lazy loading ?)

OC有多继承吗?没有的话可以用什么方法替代?

分别描述类别(categories)和延展(extensions)是什么?以及两者的区别?继承和类别在实现中有何区别?为什么Category只能为对象添加方法,却不能添加成员变量?

Objective-C有私有方法么?私有变量呢?如多没有的话,有没有什么代替的方法?

include与#import的区别? #import与@class的区别?

浅复制(拷贝)和深复制的区别? (Difference between shallow copy and deep copy?)

类变量的@protected,@private,@public,@package声明各有什么含义?

变量的作用域不同。

Objective-C与C、C+++之间的联系和区别?

目标-动作机制

Objective-C优点和缺点

C语言的函数调用和oc的消息机制有什么区别?

什么是谓词

谓词就是通过NSPredicate给定的逻辑条件作为约束条件,完成对数据的筛选。

//定义谓词对象,谓词对象中包含了过滤条件

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"age<%d",30];

//使用谓词条件过滤数组中的元素,过滤之后返回查询的结果

NSArray *array = [persons filteredArrayUsingPredicate:predicate];

//可以使用&&进行多条件过滤

predicate = [NSPredicate predicateWithFormat:@"name='1' && age>40"];

array = [persons filteredArrayUsingPredicate:predicate];

//包含语句的使用

predicate = [NSPredicate predicateWithFormat:@"self.name IN {'1','2','4'} || self.age IN{30,40}"];

//指定字符开头和指定字符结尾,是否包含指定字符

//name以a开头的

predicate = [NSPredicate predicateWithFormat:@"name BEGINSWITH 'a'"];

//name以ba结尾的

predicate = [NSPredicate predicateWithFormat:@"name ENDSWITH 'ba'"];

//name中包含字符a的

predicate = [NSPredicate predicateWithFormat:@"name CONTAINS 'a'"];

//like进行匹配多个字符

//name中只要有s字符就满足条件

predicate = [NSPredicate predicateWithFormat:@"name like 's'"];

//?代表一个字符,下面的查询条件是:name中第二个字符是s的

predicate = [NSPredicate predicateWithFormat:@"name like '?s'"];

C与OC混用

处理.m可以识别c和oc,.mm可以识别c c++ oc 但是cpp只能用c/c++

atomic和nonatomic的区别

常见的oc数据类型哪些,和c的基本类型有啥区别

id和nil代表什么

nil和NULL的区别?

nil、Nil、NULL和NSNull区别

向一个nil对象发送消息会发生什么?

-如果方法返回值为结构体,正如在《Mac OS X ABI 函数调用指南》,发送给nil的消息将返回0。结构体中各个字段的值将都是0。其他的结构体数据类型将不是用0填充的。

self.和self->的区别

类方法和实例方法的本质区别和联系

类方法 实例方法
属于类对象 属于实例对象
只能类对象调用 实例对象调用
self是类对象 self是实例对象
类方法可以调用其他类方法 实例方法可以调用实例方法
类方法不能访问成员变量 实例方法可以访问成员变量
类方法不能直接调用对象方法 实例方法可以调用类方法

_block/weak修饰符区别

写一个NSString类的实现

NSString *str = [[NSString alloc]initWithCString:nullTerminatedCString encoding:encoding];

为什么标准头文件都有类似以下的结构?

ifndef __INCvxWorksh

define __INCvxWorksh

ifdef __cplusplus

extern "C" {

endif

ifdef __cplusplus

}

endif

endif

显然,头文件中的编译宏“#ifndef __INCvxWorksh、#define __INCvxWorksh、#endif” 的作用是防止该头文件被重复引用

init和initwithobject区别(语法)?

@property的本质是什么?ivar、getter、setter是如何生成并添加到这个类中的?

@property的本质:
@property = ivar(实例变量) + getter(取方法) + setter(存方法)
“属性” (property)有两大概念:ivar(实例变量)、存取方法(access method = getter + setter)
ivar、getter、setter如何生成并添加到类中:
这是编译器自动合成的,通过@synthesize关键字指定,若不指定,默认为@synthesize propertyName = _propertyName;若手动实现了getter/setter方法,则不会自动合成。
现在编译器已经默认为我们添加@synthesize propertyName = _propertyName;因此不再需要手动添加了,除非你真的要改成员变量名。
生成getter方法时,会判断当前属性名是否有_,比如声明属性为@property (nonatomic, copy) NSString *_name;那么所生成的成员变量名就会变成__name,如果我们要手动生成getter方法,就要判断是否以_开头了。
不过,命名都要有规范,是不允许声明属性是使用_开头的,不规范的命名,在使用runtime时,会带来很多的不方便的。

这个写法会出什么问题:@property (copy) NSMutableArray *array;

@protocol和category中如何使用 @property

•   在protocol中使用@property只会生成setter和getter方法声明,我们使用属性的目的是希望遵守我协议的对象能实现该属性
•   category使用@property也是只会生成setter和getter方法的声明,如果我们真的需要给category增加属性的实现,需要借助于运行时的两个函数:
•   objc_setAssociatedObject
•   objc_getAssociatedObject

@property中有哪些属性关键字?

  1. 原子性 (atomic,nonatomic)

  2. 读写(readwrite, readonly)

  3. 内存管理(assign, strong, weak, unsafe_unretained,copy)

  4. getter、setter

isa指针问题

如何访问并修改一个类的私有属性?

如何为 Class 定义一个对外只读对内可读写的属性?

在头文件中将属性定义为readonly,在.m文件中将属性重新定义为readwrite

Objective-C 中,meta-class 指的是什么?

meta-class 是 Class 对象的类,为这个Class类存储类方法,当一个类发送消息时,就去这个类对应的meta-class中查找那个消息,每个Class都有不同的meta-class,所有的meta-class都使用基类的meta-class(假如类继承NSObject,那么他所对应的meta-class也是NSObject)作为他们的类

Objective-C 的class是如何实现的?Selector是如何被转化为 C 语言的函数调用的?

对于语句NSString *obj = [[NSData alloc] init]; ,编译时和运行时obj分别是什么类型?

@synthesize和@dynamic分别有什么作用?

- @property有两个对应的词,一个是 @synthesize,一个是 @dynamic。如果 @synthesize和 @dynamic都没写,那么默认的就是@syntheszie var = _var;
- @synthesize 的语义是如果你没有手动实现 setter 方法和 getter 方法,那么编译器会自动为你加上这两个方法。
- @dynamic 告诉编译器:属性的 setter 与 getter 方法由用户自己实现,不自动生成。(当然对于 readonly 的属性只需提供 getter 即可)。假如一个属性被声明为 @dynamic var,然后你没有提供 @setter方法和 @getter 方法,编译的时候没问题,但是当程序运行到 instance.var = someVar,由于缺 setter 方法会导致程序崩溃;或者当运行到 someVar = var 时,由于缺 getter 方法同样会导致崩溃。编译时没问题,运行时才执行相应的方法,这就是所谓的动态绑定。

NSString 的时候用copy和strong的区别?

OC中NSString为不可变字符串的时候,用copy和strong都是只分配一次内存,但是如果用copy的时候,需要先判断字符串是否是不可变字符串,如果是不可变字符串,就不再分配空间,如果是可变字符串才分配空间。如果程序中用到NSString的地方特别多,每一次都要先进行判断就会耗费性能,影响用户体验,用strong就不会再进行判断,所以,不可变字符串可以直接用strong。

NSArray、NSSet、NSDictionary与NSMutableArray、NSMutableSet、NSMutableDictionary的特性和作用(遇到copy修饰产生的变化)

请把字符串2015-04-10格式化日期转为NSDate类型

NSString *timeStr = @"2015-04-10";
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
formatter.dateFormat = @"yyyy-MM-dd";
formatter.timeZone = [NSTimeZone defaultTimeZone];
NSDate *date = [formatter dateFromString:timeStr];
// 2015-04-09 16:00:00 +0000
NSLog(@"%@", date);

在一个对象的方法里:self.name=@object;和name=@object有什么不同

怎样使用performSelector传入3个以上参数,其中一个为结构体

- (id)performSelector:(SEL)aSelector;
- (id)performSelector:(SEL)aSelector withObject:(id)object;
- (id)performSelector:(SEL)aSelector withObject:(id)object1 withObject:(id)object2;

因为系统提供的performSelector的api中,并没有提供三个参数。因此,我们只能传数组或者字典,但是数组或者字典只有存入对象类型,而结构体并不是对象类型,那么怎么办呢?
没有办法,我们只能通过对象放入结构作为属性来传过去了:

ypedef struct HYBStruct {
  int a;
  int b;
} *my_struct;
 
@interface HYBObject : NSObject
 
@property (nonatomic, assign) my_struct arg3;
@property (nonatomic, copy)  NSString *arg1;
@property (nonatomic, copy) NSString *arg2;
 
@end
 
@implementation HYBObject
 
// 在堆上分配的内存,我们要手动释放掉
- (void)dealloc {
  free(self.arg3);
}
 
@end

测试:

my_struct str = (my_struct)(malloc(sizeof(my_struct)));
str->a = 1;
str->b = 2;
HYBObject *obj = [[HYBObject alloc] init];
obj.arg1 = @"arg1";
obj.arg2 = @"arg2";
obj.arg3 = str;
 
[self performSelector:@selector(call:) withObject:obj];
  
// 在回调时得到正确的数据的
- (void)call:(HYBObject *)obj {
    NSLog(@"%d %d", obj.arg3->a, obj.arg3->b);
}

objc中向一个对象发送消息[obj foo]和objc_msgSend()函数之间有什么关系?

实际上,编译器在编译时会转换成objc_msgSend,大概会像这样:
((void (*)(id, SEL))(void)objc_msgSend)((id)obj, sel_registerName("foo"));
也就是说,[obj foo];在objc动态编译时,会被转换为:objc_msgSend(obj, @selector(foo));这样的形式,但是需要根据具体的参数类型及返回值类型进行相应的类型转换。

下面的代码输出什么?


@implementation Son : Father
 
- (id)init {
    self = [super init];
    if (self) {
        NSLog(@"%@", NSStringFromClass([self class]));
        NSLog(@"%@", NSStringFromClass([super class]));
    }
    return self;
}
 
@end
 
// 输出
NSStringFromClass([self class]) = Son
NSStringFromClass([super class]) = Son
这个题目主要是考察关于Objective-C中对self和super的理解。我们都知道:self是类的隐藏参数,指向当前调用方法的这个类的实例。那super呢?
很多人会想当然的认为“super和self类似,应该是指向父类的指针吧!”。这是很普遍的一个误区。其实 super是一个 Magic Keyword,它本质是一个编译器标示符,和self 是指向的同一个消息接受者!他们两个的不同点在于:super会告诉编译器,调用class 这个方法时,要去父类的方法,而不是本类里的。
上面的例子不管调用[self class]还是[super class],接受消息的对象都是当前 Son *xxx 这个对象。
当使用self调用方法时,会从当前类的方法列表中开始找,如果没有,就从父类中再找;而当使用super时,则从父类的方法列表中开始找。然后调用父类的这个方法。

若一个类有实例变量NSString *_foo,调用setValue:forKey:时,可以以foo还是_foo作为key?

什么时候使用NSMutableArray,什么时候使用NSArray?

类NSObject的那些方法经常被使用?

什么是简便构造方法?

什么是构造方法,使用构造方法有什么注意点。

什么是构造方法:构造方法是对象初始化并一个实例的方法。

构造方法有什么用: 一般在构造方法里 对类进行一些初始化操作
注意点:方法开头必须以init开头,接下来名称要大写 例如 initWithName ,initLayout

创建一个对象需要经过那三个步骤?

Get方法的作用是什么?

Get方法的作用:为调用者返回对象内部的成员变量

Set方法的作用是什么?Set方法的好处?

结构体当中能定义oc对象吗?

不能, 因为结构体当中只能是类型的声明不能进行分配空间

点语法本质是什么,写一个点语法的例子,并写上注释

id类型是什么,instancetype是什么,有什么区别?

成员变量名的命名以下划线开头的好处?

这段代码有什么问题吗:

 @implementation Person
- (void)setAge:(int)newAge {
self.age = newAge; }
@end
会死循环,会重复调用自己!self.age 改为_age即可;
并且书写不规范:setter方法中的newAge应该为age

截取字符串”20 | http://www.baidu.com”中,”|”字符前面和后面的数据,分别输出它们。

   NSString * str = @"20 | http://www.baidu.com";
NSArray *array = [str componentsSeparatedByString:@"|"]; //这是分别输出的截取后的字符串
for (int i = 0; i<[array count]; ++i) { NSLog(@"%d=%@",i,[array objectAtIndex:i]);
}

写一个完整的代理,包括声明,实现

//创建
@protocol MyDelagate
@required
-(void)eat:(NSString *)foodName;
@optional
-(void)run;
@end

//声明
@interface person: NSObject< MyDelagate>

//实现
@implementation person
-(void)eat:(NSString *)foodName;
{ NSLog(@"吃:%@!",foodName);}
-(void)run
{ NSLog(@"run!");}
@end

isKindOfClass、isMemberOfClass、selector作用分别是什么

请分别写出SEL、id、@的意思?

unsigned int 和int 有什么区别。假设int长度为65535,请写出unsigned int与 int的取值范围

int:基本整型,当字节数为2时 取值范围为-32768~32767,当字节数为4时 取值范围
负的2的31次方 到 2的31次方减1
unsigned int:无符号基本整型,当字节数为2时 取值范围为0~65535,当字节数为4时 取值范围为0到2的32次方减1

Foundation对象与Core Foundation对象有什么区别

编写一个函数,实现递归删除指定路径下的所有文件。

+ (void)deleteFiles:(NSString *)path;{
    // 1.判断文件还是目录
    NSFileManager * fileManger = [NSFileManager defaultManager];
    BOOL isDir = NO;
    BOOL isExist = [fileManger fileExistsAtPath:path isDirectory:&isDir];
    if (isExist) {
        // 2. 判断是不是目录
        if (isDir) {
        NSArray * dirArray = [fileManger contentsOfDirectoryAtPath:path error:nil];
            NSString * subPath = nil;
            for (NSString * str in dirArray) {
                subPath  = [path stringByAppendingPathComponent:str];
                BOOL issubDir = NO;
                 [fileManger fileExistsAtPath:subPath isDirectory:&issubDir];
                [self deleteFiles:subPath];
            }
            
           
        }else{
            NSLog(@"%@",path);
            [manager removeItemAtPath:filePath error:nil];  
        }
    }else{
        NSLog(@"你打印的是目录或者不存在");
    }
}

文章如有问题,请留言,我将及时更正。

满地打滚卖萌求赞,如果本文帮助到你,轻点下方的红心,给作者君增加更新的动力。

上一篇下一篇

猜你喜欢

热点阅读