一、类与结构体的区别
- 1 类型 不同
类 class 是引用类型(指针),结构体 struct 是值类型的 。
因此如果两个指针指向同一个对象,一方改变会影响另一方; 但是值类型不会相互影响。 - 2 存储 位置不同
类作为引用类型存在 堆 中,结构体作为值类型存与 栈 中 。 - 3 功能 不同
类具备继承、运行时强制类型转换等功能, 结构体没有。
二、属性、成员变量、实例变量的区别
-
1 属性
属性用@property 修饰,会自动生成set和get方法。
写在.h文件中,允许外部访问。写在.m中只允许本类访问。 -
2 成员变量
写在{}里的就是成员变量如age name,只允许本类访问。 不会自动生成set方法和get方法。
-
3 实例变量
实例变量是相对类而言的,因此实例变量是特殊的(除掉基本数据类型
)成员变量。如age是成员变量但不是实例变量。
成员变量 = 实例变量 + 基本数据类型。
三、成员变量修饰符的关系
#import <Foundation/Foundation.h>
@interface Person : NSObject
{
@public
NSString *name;
@private
NSString *sex;
@protected
NSString *address;
@package
int teleNum;
}
成员变量修饰符就是修饰{}内的成员变量, 包含@public、@private、@protected、@package四种。
**修饰范围**: 当前修饰符到下一个修饰符之间。
注:所有的实例变量 默认是被@protect
所修饰。
子类继承父类,拥有父类的属性,但是若存在修饰符也要根据修饰符判断是否能够访问。
-
1 @public
@public修饰的成员变量
本类中可以访问,子类中可以访问,其他类中也可以访问。 -
2 @private
本类中可以访问,子类中不可以访问,其他类也不可以访问。 绝对的私有。
-
3 @protect
本类中可以访问,子类中也可以访问,其他类不可以访问。 部分私有。 -
4 @package
介于@private和@public之间;
在本包如Foundation框架下的是@public, 框架即包以外的是@private.
访问比较: @private < @protect < @public
四、isMemberOfClass 和 isKindOfClass 联系与区别?
这是内省的两个方法,即在运行时可以判断当前对象的类型。
isKindOfClass 表示判断当前对象 是否是**某个类或者某个类的子类** 所创建的对象;
isMemberOfClass 仅判断当前对象 是否为某个类的对象。
如: Father 继承NSObject , Son 继承 Father
Father *f = [[Father alloc] init]; Son *s = [[Son alloc]init];
[s isKindOfClass:[Son class]] √
[s isKindOfClass:[Father class]] √
[s isKindOfClass:[NSObject class]] √
[s isMemberOfClass:[Son class]] √
[s isMemberOfClass:[Father class]] X
[s isMemberOfClass:[NSObject class]] X
五、instancetype 与 id 区别?
在自定义构造方法,重写init时,返回值是instanceType
区别:
1. 编译时类型的判断: instancetype 在编译时可以判断对象的真实类型,id 不行。
2. 使用: instancetype 只能作为返回值类型。id 既可以做返回值类型,又可以定义变量、做形参。
六、load和initialize 关系与区别?
load 和 initialize 是与类创建对象相关的方法。
关系:
1.调用次数:都只会被调用一次。
2.在继承的调用顺序: 都是先调用父类的 load 和 initialize, 再调用子类的 load 和 initialize 方法;
并且如果用到子类创建对象,即使没有用到父类,也是先调用父类的 initialize 再调用子类的。
七、内存中,堆和栈的区别?
- 栈中对象的创建销毁是系统自动管理,而堆中则需要程序员手动控制。
- 存放内容:栈中一般存放返回地址、局部变量, 堆中存放对象。
- 分配效率:栈由系统控制分配效率高,栈需要手动申请管理且容易产生碎片效率低。
- 内存碎片:栈不存在内碎片问题,但是堆由于频繁的创建销毁往往会产生内存碎片。
- 生长方向与内存大小:
栈由高地址向低地址,栈申请空间较小;堆低地址向高地址,堆申请空间较大。