各种辨析

一、类与结构体的区别

  • 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 关系与区别?

loadinitialize 是与类创建对象相关的方法。
关系
1.调用次数:都只会被调用一次
2.在继承的调用顺序: 都是先调用父类的 load 和 initialize, 再调用子类的 load 和 initialize 方法;
并且如果用到子类创建对象,即使没有用到父类,也是先调用父类的 initialize 再调用子类的。


七、内存中,堆和栈的区别?

  1. 栈中对象的创建销毁是系统自动管理,而堆中则需要程序员手动控制。
  2. 存放内容:栈中一般存放返回地址、局部变量, 堆中存放对象。
  3. 分配效率:栈由系统控制分配效率高,栈需要手动申请管理且容易产生碎片效率低。
  4. 内存碎片:栈不存在内碎片问题,但是堆由于频繁的创建销毁往往会产生内存碎片。
  5. 生长方向与内存大小
    栈由高地址向低地址,栈申请空间较小;堆低地址向高地址,堆申请空间较大。

八、进程与线程的区别?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值