iOS面试题目

    1 OC中,与alloc语义相反的方法是dealloc还是release?与retain语义相反的方法是dealloc还是release?为什么?需要与alloc配对使用的方法是dealloc还是release,为什么?

    以下是针对MRC(手动内存释放)模式:
    与alloc语义相反的方法是dealloc,与retain语义相反的方法是release。
    alloc是为对象在内存中开辟空间,而dealloc则是对象销毁时释放空间。
    retain方法是对象开辟空间以后使对象的引用计数器加1,而release是对象的引用计数器减1。
    需要与alloc配对的方法是release,因为对象创建以后,对象的引用计数器自动加1,
    而调用release方法后,对象的引用计数器归0,系统会自动调用dealloc方法释放空间。

   2.  在一个对象的方法里面: self.name = @"object"; 和  _name = @"object" 有什么不同吗?
           
self.name = @"object"; 是通过点语法修改属性name的值。
    本质上使用的是name属性的setter方法进行的赋值操作,实际上执行的代码是

    [self setName:@"object"];

    例如:
    @property(nonatomic, strong) NSString *name;
    //根据@property关键词,系统自动生成setter方法。
    - (void)setName:(NSString *)name{
        //根据strong关键词
        [name retain];  //内存计数+1
        [_name release];    //把之前指针指向的内容内存计数-1
        _name = name; //指向新内容
    }

    _name = @“object”; 只是单纯的把‘_name’指针指向‘@"object"’字符串对象所在的地址,
    没有调用方法。
 3. 这段代码有什么问题吗?
-(void)setAge:(int)newAge{ 
self.age = newAge; 
}
在age属性的setter方法中,不能通过点语法给该属性赋值。
    会造成setter方法的循环调用。因为self.age = newAge; 
    本质上是在调用 [self setAge:newAge]; 方法。
    解决循环调用的方法是方法体修改为 _age = newAge;

    另外 变量名称不能使用new开头!
4. 简要叙述面向对象的特点,特别是多态。
1. 封装
封装是对象和类概念的主要特性。它是隐藏内部实现,提供外部接口,可以看作是“包装”。 
封装,也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,
对不可信的进行信息隐藏。
封装的目的是增强安全性和简化编程,使用者不必了解具体的实现细节,而只是要通过外部接口,
以特定的访问权限来使用类的成员。
好处:可以隐藏内部实现细节。通过大量功能类封装,加快后期开发速度。

2. 继承
面向对象编程 (OOP) 语言的一个主要功能就是“继承”。
继承是指这样一种能力:它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下
对这些功能进行扩展。
通过继承创建的新类称为“子类”或“派生类”,被继承的类称为“基类”、“父类”或“超类”。
继承的过程,就是从一般到特殊的过程。在考虑使用继承时,有一点需要注意,
那就是两个类之间的关系应该是“属于”关系。
例如,Employee(雇员)是一个人,Manager(领导)也是一个人,因此这两个类都可以继承Person类。
但是 Leg(腿) 类却不能继承 Person 类,因为腿并不是一个人。

3. 多态
多态性(polymorphism)是允许你将父对象设置成为和一个或更多的他的子对象相等的技术,
赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。
简单的说,就是一句话:允许将子类类型的指针赋值给父类类型的指针。
不同对象以自己的方式响应相同的消息的能力叫做多态。
意思就是假设生物类(life)都用有一个相同的 方法-eat;那人类属于生物,猪也属于生物,
都继承了life后,实现各自的eat,但是调用是我们只需调用各自的eat方法。
也就是不同的对象以 自己的方式响应了相同的消息(响应了eat这个选择器)。
实现多态,有二种方式,覆盖,重载。
•    覆盖(override),是指子类重新定义父类的虚函数的做法。
•    重载(overload),是指允许存在多个同名函数,而这些函数的参数表不同
        (或许参数个数不同,或许参数类型不同,或许两者都不同)。
** 这里注意:OC没有重载,因为OC只认函数名,不认参数类型。OC不允许存在多个同名函数。

总结:封装可以隐藏实现细节,使得代码模块化;继承可以扩展已存在的代码模块(类);
它们的目的都是为了——代码重用。
而多态则是为了实现另一个目的——接口重用!
多态的作用,就是为了类在继承和派生的时候,保证使用“家谱”中任一类的实例的某一属性时的正确调用。
在类层次中,子类只继承一个父类的数据结构和方法,则称为单重继承。 
在类层次中,子类继承了多个父类的数据结构和方法,则称为多重继承。 
5. objective-c 所有对象间的交互是如何实现的?
在对象间交互中每个对象承担的角色不同,
但总的来说无非就是”数据的发送者”或”数据的接收者”两种角色。
消息的正向传递比较简单,直接拿到接受者的指针即可。
消息的反响传递可以通过委托模式,观察者模式(本质是单例模式),block语法,AppDelegagte来实现。
其中委托模式,block语法都是1对1的消息传递。 观察者模式是1对多。
AppDelegate比较特殊,这是一个生命周期与进程一致的对象。
6. 什么叫数据结构?
数据结构是计算机存储、组织数据的方式。是指相互之间存在一种或多种特定关系的数据元素的集合。
通常,精心选择的数据结构可以带来更高的运行或者存储效率。
7、OC的类可以多继承吗?可以实现多个接口吗?Category是什么?分类中能定义成员变量或属性吗?为什么?重写一个类的方式是继承好还是类别好?为什么?
Object-c的类不可以多重继承;可以实现多个接口(协议),通过实现多个接口可以完成C++的多重继承;
Category是类别,推荐使用类别,用Category去重写类的方法,仅对本引入Category的类有效,
不会影响到其他类与原有类的关系。
8、#import和#include有什么区别?@class呢?#import<>和#import”“有什么区别?#import和#include有什么区别?@class呢?#import<>和#import”“有什么区别?
#import是Objective-C导入头文件的关键字,#include是C/C++导入头文件的关键字,
使用#import头文件会自动只导入一次,不会重复导入,相当于#include和#pragma once;
@class告诉编译器某个类的声明,当执行时,才去查看类的实现文件,可以解决头文件的相互包含;
#import<>用来包含系统的头文件,#import””用来包含用户头文件。
例如:

/* 如果这里不写@class,则报错。 原因是找不到MyVC的定义。因为代码执行顺序是由上至下的。
当声明协议MyVCDelegate时, MyVC还没有声明。
使用 @class 名称随便写,不管是否存在。 可以自己用代码尝试随意写个@class 例如:
@class Hello; 
就算项目中根本没有Hello类,这里也不会报错。 因为只有当项目运行起来,才会真的去检查Hello类
是否声明了。
*/

@class MyVC;
@protocol MyVCDelegate <NSObject>
- (void)myVC:(MyVC *)myVC click:(id)sender;
@end
@interface MyVC : BaseVC
@end

ps:iOS7之后的新特性,可以使用@import 关键词来代理#import引入系统类库。
    使用@import引入系统类库,不需要到build phases中先添加添加系统库到项目中。

9、写一个setter方法用于完成@property(nonatomic, strong)NSString *name, 写一个setter方法用于完成@property(nonatomic, copy)NSString *name
- (void)setName:(NSString*)str //retain
 {
  [str retain];
  [_name release];
  _name = str;
 }
- (void)setName:(NSString *)str //copy
 {
  id t = [str copy];
  [_name release];
  _name = t;
 }
10、对于语句NSString *obj = [[NSData alloc] init]; obj在编译时和运行时分别是什么类型的对象?
编译时是NSString的类型;运行时是NSData类型的对象。
11、常见的OC的数据类型有哪些? 和C的基本数据类型有什么区别? 如:NSInteger和int
object-c的数据类型有NSString,NSNumber,NSArray,NSMutableArray,NSData等等。

C语言的基本数据类型int,只是一定字节的内存空间,用于存放数值;
NSInteger类型的定义是

#if __LP64__ || (TARGET_OS_EMBEDDED && !TARGET_OS_IPHONE) 
|| TARGET_OS_WIN32  || NS_BUILD_32_LIKE_64
typedef long NSInteger;
typedef unsigned long NSUInteger;
#else   
typedef int NSInteger;
typedef unsigned int NSUInteger;
#endif

可以看到,在64位操作系统上,NSInteger是 C语言的long类型。 
在32位操作系统上,则是int类型。
12、id声明的对象有什么特性?
id 声明的对象具有运行时的特性,即可以指向任意类型的objcetive-c的对象;
可以作为返回值,也可以声明对象。
例如
- (id)initWithName:(NSString *)name;
id obj = [NSObject new];

现在我们使用苹果推荐使用的“instancetype”类型代替id类型作为返回值
- (instancetype)initWithName:(NSString *)name;

instancetype和id的区别在于, id可以声明对象 也可以作为返回值,
instancetype只能作为返回值。
13、OC如何对内存管理的,说说你的看法和解决方法。
Objective-C的内存管理主要有三种方式ARC(自动内存计数)、手动内存计数、内存池。
  1. 自动内存计数ARC:由Xcode自动在App编译阶段,在代码中添加内存管理代码。
  2. 手动内存计数MRC:遵循内存谁申请,谁添加。谁释放的原则。
  3. 内存释放池Release Pool:把需要释放的内存统一放在一个池子中,当池子被抽干后(drain)
    池子中所有的内存空间也被自动释放掉。 内存池的释放操作分为自动和手动。
     自动释放受runloop机制影响。
14、你对@interface中的成员变量和@property声明的属性的理解。
@interface AA: NSObject{
    NSString *_name; //成员变量
}
@property NSString *sex; //属性

如上所示:
属性拥有setter和getter方法 外加_sex成员变量。
_name只是成员变量, 没有setter和getter方法。
15、浅拷贝和深拷贝的区别?
浅拷贝:只复制指向对象的指针,而不复制引用对象本身。 
深拷贝:复制引用和对象本身。 
意思就是说我有个A对象,复制一份后得到A_copy对象后, 
对于浅复制来说,A和A_copy指向的是同一个内存资源,复制的只不过是是一个指针, 
对象本身资源还是只有一份。 
那如果我们对A_copy执行了修改操作,那么发现A引用的对象同样被修改, 
这其实违背了我们复制拷贝的一个思想。 
深复制就好理解了,内存中存在了两份独立对象本身。
 
用网上一哥们通俗的话将就是:
 
浅拷贝好比你和你的影子,你完蛋,你的影子也完蛋
 
深拷贝好比你和你的克隆人,你完蛋,你的克隆人还活着。
16、类别的作用?继承和类别在实现中有何区别?
Category可以向类中添加新的方法,或者重写已有方法。
正常情况下不可以添加属性。但是实际应用中可以通过runtime机制添加属性。
类别主要有3个作用:
- 将类的实现分散到多个不同文件或多个不同框架中。降低耦合性。
- 重写主类方法
- 向类中添加协议,属性,方法。

继承主要作用:
- 重写父类方法
- 在父类基础上增加属性,方法,协议

区别:继承使用时,需要使用子类。 Category使用时只需要引入头文件。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
资源包主要包含以下内容: ASP项源码:每个资源包中都包含完整的ASP项源码,这些源码采用了经典的ASP技术开发,结构清晰、注释详细,帮助用户轻松理解整个项的逻辑和实现方式。通过这些源码,用户可以学习到ASP的基本语法、服务器端脚本编写方法、数据库操作、用户权限管理等关键技术。 数据库设计文件:为了方便用户更好地理解系统的后台逻辑,每个项中都附带了完整的数据库设计文件。这些文件通常包括数据库结构图、数据表设计文档,以及示例数据SQL脚本。用户可以通过这些文件快速搭建项所需的数据库环境,并了解各个数据表之间的关系和作用。 详细的开发文档:每个资源包都附有详细的开发文档,文档内容包括项背景介绍、功能模块说明、系统流程图、用户界面设计以及关键代码解析等。这些文档为用户提供了深入的学习材料,使得即便是从零开始的开发者也能逐步掌握项开发的全过程。 项演示与使用指南:为帮助用户更好地理解和使用这些ASP项,每个资源包中都包含项的演示文件和使用指南。演示文件通常以视频或图文形式展示项的主要功能和操作流程,使用指南则详细说明了如何配置开发环境、部署项以及常见问题的解决方法。 毕业设计参考:对于正在准备毕业设计的学生来说,这些资源包是绝佳的参考材料。每个项不仅功能完善、结构清晰,还符合常见的毕业设计要求和标准。通过这些项,学生可以学习到如何从零开始构建一个完整的Web系统,并积累丰富的项经验。
资源包主要包含以下内容: ASP项源码:每个资源包中都包含完整的ASP项源码,这些源码采用了经典的ASP技术开发,结构清晰、注释详细,帮助用户轻松理解整个项的逻辑和实现方式。通过这些源码,用户可以学习到ASP的基本语法、服务器端脚本编写方法、数据库操作、用户权限管理等关键技术。 数据库设计文件:为了方便用户更好地理解系统的后台逻辑,每个项中都附带了完整的数据库设计文件。这些文件通常包括数据库结构图、数据表设计文档,以及示例数据SQL脚本。用户可以通过这些文件快速搭建项所需的数据库环境,并了解各个数据表之间的关系和作用。 详细的开发文档:每个资源包都附有详细的开发文档,文档内容包括项背景介绍、功能模块说明、系统流程图、用户界面设计以及关键代码解析等。这些文档为用户提供了深入的学习材料,使得即便是从零开始的开发者也能逐步掌握项开发的全过程。 项演示与使用指南:为帮助用户更好地理解和使用这些ASP项,每个资源包中都包含项的演示文件和使用指南。演示文件通常以视频或图文形式展示项的主要功能和操作流程,使用指南则详细说明了如何配置开发环境、部署项以及常见问题的解决方法。 毕业设计参考:对于正在准备毕业设计的学生来说,这些资源包是绝佳的参考材料。每个项不仅功能完善、结构清晰,还符合常见的毕业设计要求和标准。通过这些项,学生可以学习到如何从零开始构建一个完整的Web系统,并积累丰富的项经验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值