A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© zhao543 中级黑马   /  2017-6-13 22:55  /  1369 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

1. #import的作用
#import 防止头文件重复保函

2.面向对象和面向过程的区别
面向过程:注重的是解决问题的步骤
面向对象:关注的是解决问题的去要那些对象

3.对象和类方法的区别
对象:以减号开头
只可以被对象调用,可以访问成员变量
类:以加号开头
只能用类名调用,对象不可以调用
类方法不能访问成员变量

4.self 与 super区别
self代表着当前方法的调用者

super是一个编译指令可以直接调用当前父类方法
当前类的父类的调用者
super在类方法中,它就代表了调用当前类方法的类的父类,如果在对象方法中,它就代表调用当前对象方法的对象的父类对象

5.继承和多态
当调用方法时,首先检测子类有没有实现这个的方法,如果子类没有重写这个方法,就会调用父类的方法
重写:子类重新实现父类的方法



6.多态:多态就是某一类事物的多种形态.多态性是允许你将父对象设置成为和一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作

7.点语法就是用来调用set和get的方法

8.@property 和 @syntheesize   —-森的赛
Xcode 4.4前:自动生成set和get声明方法
Xcode 4.5后:自动生成set和get的声明和实现方法 在.m文件中生成下划线开头的成员变量

在Xcode 4.4前自动生成set和get方法的实现
在Xcode 4.4可以不写

9.内存管理
管理范围:任何继承于 NSObject的对象
原理:
每一个对象都有引用计数器
当使用alloc new 和 copy创建对象时引用计数器被设置为1
给对象发送一条retain消息 ,引用计数器加1      —
给对象发送一条relrase消息,引用计数器会减1
计数器为0时,对象会被回收
只要用alloc new创建新对象,那么你就有责任做一次release
不可以再操作已经被释放的对象,不然会发生野指针错误
在对象释放前操作对象
你想使用某个对象,就应该放对象的计数器+1
你不想使用某个对象,就应该让对象的计数器-1

成员变量内存管理(如果成员变量是对象,才需要管理)
哪里有 alloc new 哪里有 release
release 旧对象
retain新对象
dealloc 方法就是释放当前拥有的所有对象

nonatomic:性能高 多线程不加锁   —诺米拖米克
atomic 性能低,多线程加锁      -啊拖你克

autorelease 会将对象放到一个自动释放池中
当自动释放池被销毁,会将池里的所有对象的一次release操作

10.分类(category)在不改变类的情况下给一个类动态添加方法,可以访问原来的成员变量和方法,但不可以添加成员变量    ——开地格瑞
继承有: 封装 继承 多态   子类继承父类的属性和行为

11.协议protocol  —泼提科了
遵守某个协议,只要遵守这个协议,就就相当于拥有了这个协议里面所有的方法和声明

@pequired是必须实现     —瑞快额特
@optional 可以选实现     —哦破神no

分类和协议只能声明方法,不可以声明变量
NSObject是基类协议


12.block的作用:封装代码,用来保存一段代码
block 内部可以访问外面的变量
默认情况下,block 内部不能修改外面的局部变量
给局部变量加上_block,这个局部变量就可以在block内部改变

13.@class 和 #import的区别
@class做一个简单的声明,并不包含 类方法的声明和成员变量的声明
@import 是把整个类的所有声明都拷贝一份

@import和@class同时在.h 和 .m中可以解决循环依赖的问题

循环retain
两个类相互包含,就会出现无法释放的问题 一边用retain 另一边用assign



15.static 修饰局部变量时增加生命周期,在程序退出时才会销毁    —死带地科

16.id 和 instancetype的区别    —因死疼死太普
id能作为方法或函数的返回值 参数值 也可以用来定义变量
instancetype 只能作为函数或者方法的返回值
instancetype对比id的好处就是:能精确的限制返回值的具体类型

16.重写:子类继承父类会继承的方法,方法名不变重新写自己的实现

注意:1.父类必须声明子类的成员变量
2.子类不能拥有和父类的相同的成员变量
3.调用对象的方法,在当前找 找不到会到父类中找 找不到到NSObjet   没有就报错;

17.数组的定义使用与特点
数组中类型一旦确定,不可以更改
数组的长度是固定的

18.ARC的特点
不允许调用 release retain retainCount    —瑞疼抗德
允许重写dealloc 但是不允许调用[super dealloc]
@property的参数
strong 成员变量是强指针,相当于与原来的retain      —死撞
weak:成员变量的弱指针,相当与原来的  assign  —啊赛
assign:适用于非oc 的对象类型

19.SEL
每一个类的方法列表都是储存在类的对象中
根据医改SEL对象就可以找到方法的地址,进而调用方法

20.copy语法的目的就是改变副本,不影响源对象
深拷贝:内容拷贝,会产生新的的对象,新的对象的计数器值为1,源对象不变.
浅拷贝:指针拷贝,是不会产生新的对象,源对象的计数器值为+1.
除了 不可变 调用copy是浅拷贝,其他都是深拷贝.


21.@puplic (公开的) 作用于当前类    ——怕不理科
@protected  (受保护的) 作用于当前类,子类(派生类)   —-泼了太科提
@private (私有的)作用于当前类    ——泼外we特



1.NSLog和Printf的区别
1)NSLog可以自动换行,输出调试信息,printf不能
2)NSLog函数的参数是一个NSString的对象
3)printf函数的参数是一个字符串常量指针
2.#import 和 #include的区别  都是拷贝
1)import可以防止头文件的重复包含,include不能
2)include是使用预处理指令来防止头文件的重复包含
#ifndef C7________xxx_h
#define C7________xxx_h
3.new的三件事
1)向计算机(堆区)申请内存空间;
2)给实例变量初始化;
3)返回所申请空间的首地址;

4.实例变量的修饰符 作用范围
@puplic (公开的) 作用于当前类
@protected  (受保护的) 作用于当前类,子类(派生类)
@private (私有的)作用于当前类
@package (框架级别的)  作用于框架级别的     —   派ki鸡
5.C和OC static的区别
在C语言中 static可以修饰
1)局部变量(延长局部变量的周期)
2)全局变量(当前变量只能在本文件中访问)
3)函数(当前函数只能在本文件中访问)
在OC中 static不能修饰方法 但是可以修饰全局变量和局部变量
6.@proprety增强做的三件事
1)在.h文件中帮我们自动生成get和set方法声明
2)在.m文件中帮我们生成私有的实例变量(前提是没有在.h文件中没有手动生成)
3)在.m文件中帮我们是实现get和set方法的
注意:
在使用@property情况下,可以重写getter和setter方法.需要注意的是,当把setter和getter方法都实现了之后,实例变量也需要手动去写.

7.NSObject和id的区别
1)NSObject和id都可以指向任何对象
2)NSObject对象会在编译时进行检查,需要强制类型转换
3)id类型不需要编译时检查,不需要强制类型转换
8.instancetype和id的区别
相同点:都可以作为返回值的类型
不同点:
1)instancetype可以返回和方法所在类相同类型的对象,id只能返回未知的对象
2)instancetype只能作为返回值,不能像id那样作为参数
9.nil , Nil ,NULL和NSNULL的区别
nil  是一个对象值;如果我们要把一个对象设置为空的时候,就用nil
Nil  是一个类对象的值,如果我们要把一个class的对象设置为空的时候,就用Nil
NULL 是一个通用指针
NSNull 是一个对象,它用在不能使用nil的场合

10.面向对象设计三个主要特征:
封装,继承,多态
封装的好处:
将变化隔离。(不管里面怎么变,使用者不需要知道)
便于使用。(使用者只需按照一定的方法使用就可以了)
提高重用性。(任何人都可以对已封装好的功能进行操作)
提高安全性。(由于暴露给使用者的只是一些外在的操作环节,而不是里面本质的东西,所以就提高了对他的维护性,也就是安全性)

继承  子类拥有了父类的所有属性和方法
多态  父类的指针指向了子类的对象(如果存在多态,父类就可以访问子类的特有方法;如果不存在多态,父类就不可以访问子类的特有方法)
11.内存分为5大区域
栈区 -- 存放局部变量,临时变量
堆区 -- 程序运行过程中,动态分配的内存
BSS区 -- 未初始化的全局变量和静态变量
数据段 -- 已经初始化的全局变量和静态变量
代码段 -- 程序编译产生的二进制的数据
12.@proprety参数
1)原子性:atmoic(原子性)noatmoic(非原子性)
2)读写属性:readwrite和readonly
3)set方法的处理:assign(修饰基本数据类型)re tain(用来修饰OC对象)copy
以上是MRC的情况下  ARC的情况下多两个(strong(强指针)weak(弱指针))
13.import和@class的区别:(面试题)
作用上的区别:#import会包含引用类的所有信息(内容),包括引用类的变量和方法;
@class仅仅是告诉编译器有这么一个类,具体这个类里有什么信息,完全不知。

效率上的区别:#import编译效率会非常低,@class就不会出现这种情况。
14.关键字的命名规则
1.只能由字母,数字,下划线或者美元符号组成
2.不能以数字开头
3.不能和关键字重名
4.严格区分大小写


15.结构体与数组有什么区别?
1.结构体可以存不同类型的元素,而数组只能存同一类型
2.结构体类型需要我们自已定义.数组是用别的类型加[元素个数]
3.结构体内存分配方式很特别,使用对齐原则,不一定是所有元素的字节数和,而数组一定是所有元素的字节数和.
4.结构体指针可以指针名->结构体元素名(取元素);数组不行.


1.        include <>: 编译器目录 → 系统目录 // 导入的系统文件
2.        include “ ”: 当前文件 → 编译器目录 → 系统目录 // 导入的是自定义文件
3. 字符串处理函数, strcpy,   strcmp,   strcat
4. const:  const 在*左边, 指向可变, 值不可变
const 在*的右边, 指向不可变, 值可变
const 在*的两边, 都不可变
5. 野指针: 在c语言里面未被初始化的指针变量,
空间被释放了, 继续访问, 会产生野指针错误(在OC中)
6. 内存泄露: 栈区的指针变量被释放, 堆区的没被释放.
7. 结构体(struct):用来存放若干个相同或者不同类型的一个构造类型
8.枚举: 当一个变量只有有限的几个取值的时候,可以使用枚举
9.typedef: 用来给已经存在的数据类型起别名, 基本数据类型, 结构体, 枚举, 函数指针, 数组.  ——太匹敌付
10. 什么宏: 用#define指令来定义的字符串
11: 什么是预处理指令: 预处理指令一般式在编译之前将要做的事情做完, 一般是以#开头的指令. 比如: 条件编译指令, 宏, 文件包含
12. static是用来干嘛的? Static可以用来修饰局部变量, 全局变量, 函数, 是一个内部的全局变量, 默认情况下只能在当前文件访问.——死带洗科
13.extern是用来干嘛的? Extern修饰的全局变量是一个外部变量, 在其他文件可以访问, 可以用来修饰全局变量, 函数, 不能用来修饰局部变量
14. 打开文件的函数,fopen, 关闭函数:fclose,
15. fread读取数据块,   fwrite:写入数据块
16.什么对象? 万物皆对象,  什么是类? 类就是一类具体事物的抽象. 类和对象之前的关系? 类是对象的抽象, 对象是类的实例
17: 内存分为哪几个区域,分别存放什么数据? 栈区:局部变量, 堆区:程序在运行过程中动态分配的内存,比如使用malloc, calloc’,relloc, 还有oc中的对象
bss区: 未被初始化的全局变量和静态变量  数据段(): 已经初始化的全局变量和静态变量, 常量也数据数据段的一部分. 代码段: 程序编译产生的二进制数据
18.什么是类方法? 以加号开头的方法,一般由类名来调用.
19:什么是封装? 给对象中的成员变量提供一个set和get方法访问的接口, 这样有利于保证数据安全性
20: 什么是self? 在方法当中,谁调用当前方法, self就代表谁.
21什么是继承? 子类继承自父类之后可以使用父类当中暴露出来成员变量和方法, 也可以重写父类中方法
22.什么是多态: 不同的对象以自己的方法响应父类的方法,它的表现形式是父类的指针变量指向之类的对象,
23.id和instancetype的区别, id和instancetype都可以作为方法的返回值, 并且id可以用来定义类型, 但是instancetype可以精确返回值的类型
24.什么是构造方法,?构造方法的作用是什么?
构造方法一般以init开头, 它的作用是当前对象创建的时候已经有固定的初始值.
25:MRC: 手动内存管理
26:ARC: 自动内存管理
27.什么循环引用: 在mrc中如果两个对象相互拥有,会产生循环引用,解决办法:一端使用retain, 一端用assign;  在arc环境下, 一端使用strong, 一端使用assing(或者weak);
28. autoreleasepool是什么? 是自动释放池,它是一个特殊的栈结构, 特点是先进后出
29.什么是分类? 分类成为category, 分类也叫类目, 类别, 在不改变原有类的基础上,给原类扩充方法  —开地格瑞
30,什么类扩展? 类扩展是一种匿名分类, 也成为”延展”, 可以声明属性, 方法.


正式协议:
非正式协议:凡是在NSObject 或其之类 Foundation 框架中的类增加类别,都是非正式协议


NSObject和id的区别:
NSObject在编译的时候会检查,需要强制转换
id是万能指针,编译的时候不会检查.

分类和继承:分类用来添加新的方法不可以改变原方法,继承可以添加改变原方法并可以增加属性


copy和retain的区别:
copy是建立一个相同的对象,是内容拷贝
retain是地址相同,是指针拷贝

类的扩展:可以增加方法和实例变量
类扩展中的声明必须要实现,不然会报错

Foundation框架:封装类 文档 数据类型 方便调用

NSString   //字符串
NSArray    //oc 的数组   只可以放对象   —NS额瑞
NSDictionary   //字典 键值对       —NS地寻呢锐

//如果碰到continue,则跳出本次循环继续下一次判断,如果条件成立继续执行循环.
//如果碰到break无论条件满足与否,循环立刻结束.

内部函数:一个函数只能被本文件中其他文件调用,在函数名和函数类型的前面的加 static    死带题刻

外部函数:在定义函数时,在函数首部的最左端加关键字 extern ,可以提供其他文件调用      一个死疼



指针与函数
1、指针作为函数参数传递是地址传递 2、指针函数:返回值为指针的函数
1、不可以返回局部变量的地址 2、可以返回常量的地址 3、可以返回堆中的地址
3、函数指针:指向函数的指针
定义一个函数指针
所指向的函数的返回值类型 (*指针变量名称)(所指向的函数的形参列表)

预处理指令:文件包含   宏定义  条件编译
预处理指令在代码编译之前执行的指令
文件包含 #include 将一个文件中的代码拷贝到另一份代码中去
宏定义#define   在编译之前进行代码的替换
条件编译 #if ##elif  让代码满足条件才编译.提高编译效率

指针:
指针是一种数据类型,他保存的是地址
用于储存某一个地址,从而可以通过地址直接对该地址内存空间进行操作
定义是:类型  *指针名
赋值:指针变量名=指针  int *p=&a;
指针本身也有地址,指针定义后地址不变,但里面的存的地址可以改变
&p表示指针自身的地址,p表示指针存的地址, *p表示指针所在的地址的内存空间



结构体:
是一种数据的类型,是构造类型.里面可以存放有关联的不用类型或相同类型的数据
用于封装不同的数据到结构体种去,方便使用
定义式:struct 结构体类型{数据的类型};
赋值:变量名.结构体元素变量=新值

数组:
用来储存一组相同数据的容器,把这个些数据统一管理起来
定义:数据类型 数组名[长度]
初始化:类型 数组名 [长度]={元素…};
赋值是:数组名[角标]=值;
数组必须要定义长度,这个长度是一个整数,定义的时候可以初始化或之后单独初始化
角标不可以>=数组的长度.他是从0开始分配的
数组当参数传递的是地址

指针数组:
他是一个数组,用来存储的数组就叫指针数组.数组里面的元素都是指针 如 int*p[3];
数组名表示第一个元素的地址,&数组名表示整个数组的地址

数组指针:
表示的是一个指针,而这个指针的类型是数组 如 int (*p)[3];
表示这个指针存的是数组第一个元素的地址

指针函数:这个是函数,这个函数返回值是指针

函数指针:这个是指针,函数在内存开辟一个块空间,函数指针就是这个空间的地址

结构体的指针:用于存储结构体的地址,并操作地址对应的结构体空间的数据

全局变量:
生命跟随程序启动创建,程序退出才会销毁
遵守就近原则
局部变量:
生命在他的作用域内,作用域一完,他就销毁

枚举:是一种数据类型,枚举类型属于构造类型的一种,里面存的都是别名的整形常量.
同一个作用域不能出现重复的元素,不同的类型也不可以

typedef:给一个数据起别名.方便使用    ——太不低发
定义:typedef 类型 别名


ARC MRC 的区别在哪里说说你对他们的理解,什么是预处理指令,什么是指针,说说你对指针的理解,什么是结构体,什么是构造方法,什么是方法的重写,继承和多态的区别,代理模式,说说你对协议的理解,release 和aoutrelease 的区别
什么时候retain 什么时候release,什么时候copy

import和include 和@class的区别在哪里,详细

什么是block 说说你对它的理解,什么是点语法
协议声明后的方法,可以不实现吗?

什么是封装,什么是对象,什么是类,说说你对对象的理解

什么是类的扩展,匿名类又是什么

什么是非正式协议


代理模式概念
传入的对象,代替当前类完成了某个功能,称为代理模式


block这种数据类型用来保存一个方法、函数、一段代码
block是一种数据类型, 可以使用这种数据类型定义变量, 并赋值。

框架是由许多类、方法、函数、文档按照一定的逻辑组织起来的集合,


1)野指针(僵尸对象)
僵尸对象: 已经被销毁的对象(不能再使用的对象)
野指针: 指向僵尸对象(不可用内存)的指针
空指针: 没有指向存储空间的指针(里面存的是nil, 也就是0)

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马