iOS 面试题:OC基本概念题<续>

来源:互联网 发布:freebsd linux 安全 编辑:程序博客网 时间:2024/05/22 00:32
第一,怎么确定一个方法的方法名
去掉减号,加号,去掉返回值,去掉参数类型,去掉参数,剩下的就是方法名了

第二,id指向任何对象类型,可以用assign,copy,retain,根据需要使用

第三,autorelease 在什么时候释放?
在碰到autoreleasepool的时候释放(可以把好几个相同的变量放几个不同的池里)

第四,协议的方法默认是@required

第五,字典集合的特点?
字典是以键值对形式的保存元素
只能存储对象,不能存储基本数据类型

第六,如何定义一个类?
类的接口部分包含实例变量,属性,和方法
可以把声明和实现都放到.h文件里
一对文件(Person.h Person.m)可以定义多个类
类比较抽象,对象比较具体

第七,什么是类目?
类目可以为没有源代码的类,添加方法
类目中的方法和原类中的方法级别一样,

第八,重写用继承把父类方法拿到子类重写

第九,什么是对象?
对象是类的实例,如美国总统奥巴马

第十,属性的属性,

具体请点击以下链接

OC 属性的属性



第十一,不要在set方法内部自己调自己,会陷入死循环


第十二,可变字符串与不可变字符串的区别
NSMutableString * str = [[NSMutableString alloc]initWithFormat:@“123”];
NSLog(@“str = %p”,str);
[str appendFormat:@“456”];
NSLog(@“str = %p”,str);
上面两次打印的地址是一样的

第十三,一个字典的key是唯一的,所以字典具有排重的功能,打印字典的时候,左边是key,右边是value

第十四,在类方法中不能使用实例变量

第十五,dealloc的注意事项(有系统自动调用)
开ARC不能写[super dealloc]的方法
OC不能重载(方法名一样,参数不一样),只能重写,

第十六,单例方法只是为了得到唯一的实例,方法中通常不带参数
单例相当于全局变量,不能释放,
比如用户登录,把用户信息写在单例里面

第十七,初始法作用是,为变量赋初值

第十八,@package

@package(框架级别)作用域介于私有和公开之间,只要处于同一个框架中就可以直接通过变量名访问.


第十九,队列先进先出,栈先进后出

第二十,动态绑定
NSString * testObject = [[NSData alloc]init]
编译时是NSString类型 (不检测)

运行时是NSData类型   (检测)

此处比较粗略,具体OC的动态特性请点击下面链接

深入Objective-C的动态特性


第二十一,block修改外部变量时,用__block修饰

第二十二,delegate或者protocol申请属性的时候为什么用assign而不是retain?

协议的声明,用assign属性,避免了循环引用,欲知详情请点击下面.

delegate或者protocol申请属性的时候为什么用assign而不是retain

ios中常用的遍历运算方法


遍历的目的是获取集合中的某个对象或执行某个操作,所以能满足这个条件的方法都可以作为备选:
经典for循环
for in
makeObjectsPerformSelector
kvc集合运算符
enumerateObjectsUsingBlock
enumerateObjectsWithOptions(NSEnumerationConcurrent)
dispatch_apply

第二十四,属性是方法不是变量  category里面就是方法不会添加变量

第二十五,看到遍历构造器,要想到autoreleasepool  ,有时候便利构造器经常会出现内存泄露的错误


第二十六,协议是多个类分享的一个方法列表,在协议中所列出的方法没有相应的实现,有其他人来实现
协议的property声明用assign特性,因为要防止对象和其他代理对象之间互相引用,导致无法释放内存


第二十七,类目,延展,协议,继承的区别
类目:类目可以在不获悉,不改变原来代码的情况下往里面添加新的方法,只能添加,不能删除原有方法,但是无法添加实例变量

延展:延展可以同时添加实例变量和方法,而且添加的方法必须实现,可以视为一个私有的类目

协议:协议是多个类共享的一个方法列表,在协议中所列出的方法没有相应的实现

继承:不但可以添加实例变量和方法,也可以重写原有类的方法

第二十八,当autorelease没有autoreleasepool 
因为便利构造器产生的对象如果没有autoreleasepool 的话是无法释放的,所以当循环数值过大时产生的对象会越来越多而且使用过的对象无法释放内存占用越来越多,严重影响性能所以要在for循环中使用atutoreleasepool,即释放内存从而避免内存泄露.

0 0