iOS面试

iOS面试基础知识自整理(待续)

2020-03-27  本文已影响0人  与安君

变量

成员变量

特性:

  1. 在@interface或@implementation里声明
  2. 用于类的内部,无需与外界接触,与类的生命周期一致
  3. 由修饰符决定子类及其他类是否可以直接访问
  4. 不会生成get、set方法
修饰符

注:在.h中成员变量的默认修饰符@protected. 在.m中成员变量的默认修饰符为@private.

属性

定义

提供了一个简单的方式来声明以及实现一个变量访问其方法

特性
  1. 以关键词@property声明,自动生成getter,setter方法(Xocde4.5以后),如没有对应的成员变量则自动生成成员变量
  2. 属性不是变量
  3. 用于与外界交互,可使用点语法访问成员变量
  4. @property 还可以出现在protocol 或者 category声明中
实现方式选项
修饰符
深拷贝和浅拷贝

深拷贝(对象拷贝):重新申请一片内存保留这个对象,与原对象之间没有关系
浅拷贝(指针拷贝):实际上相当于引用计数+1,被拷贝的和拷贝的引用同一个对象

对象 修饰类型 结果
immutableObject copy 浅拷贝拷贝
immutableObject mutableCopy 不完全深拷贝
mutableObject copy 不完全深拷贝
mutableObject mutableCopy 不完全深拷贝

注:集合类对象虽然新开辟了内存地址,但是存放在内存上的值(也就是数组里的元素仍然指向原数组元素值,并没有另外复制一份)

子类的重定义

你可以在子类中对一个属性进行重定义,但是你必须在子类中同样重复它的所有额外属性(除了readonly和readwrite)。对于类别或者协议中的属性也是一样的—当属性可能在类别或者协议中被重定义式,属性的所有额外属性也要被完整重复。

实例变量

定义

实例变量是数据类型为类的成员变量

私有变量

定义

OC中提供了关键字@private来声明私有变量,只允许本类访问

OC 中没有绝对的私有变量,这么说基于两点原因:

全局变量

定义

在@implementation外定义或方法中的变量,在任何源文件中都可以用

修饰词

局部变量

定义

写在代码块或函数中的变量为局部变量,生命周期与函数一致,系统会自动释放

方法

类方法

也称静态方法或者工厂方法

特性
  1. 以加号+开头,直接可以用类名来执行的方法(类本身会在内存中占据存储空间,里面有类\对象方法列表)
  2. 类方法中不能访问实例变量(成员变量)

实例方法

特性
  1. 以减号-开头,只能让对象调用
  2. 对象方法能访问实例变量(成员变量)
  3. 类方法和对象方法可以同名

私有方法

oc中没有提供关键字来声明私有方法,可以通过catogry的匿名类Extension通过在一个只在类的.m文件中来声明一个只能被本类访问的方法。

构造方法

默认情况下,在 OC 中创建1个对象分为两部分(new):+alloc:分配内存空间;-init :初始化对象。用作初始化对象的成员变量。

自定义构造方法示例:

- (instancetype)initWithAge:(int)age andName:(NSString *)name;
// 实现自定义构造函数 在初始化的时候为属性赋值
- (instancetype)initWithAge:(int)age andName:(NSString *)name
{
    if (self = [super init]) {
      _age = age;
      _name = name;
  }
  return self;
}

类别

单独提出的一个主意点:类别中的属性property
类与类别中添加的属性要区分开来,因为类别中只能添加方法,不能添加实例变量。这种情况下,是不会自动生成实例变量的,必须自己实现get/set方法。匿名类别(匿名扩展)是可以添加实例变量的,非匿名类别是不能添加实例变量的,只能添加方法,或者属性(其实也是方法)。
OC的分类允许给分类添加属性,但不会自动生成getter、setter方法,不过最好还是不要使用;
如果声明了属性,在实现文件中编译器会提示用 @dynamic 属性名字 来告诉开发者自己来写属性的setter方法和getter方法,而这里实现setter和getter需要用到声关联对象(存取方法在运行时动态创建绑定)。

信号量、NSLock和synchronized

面试问题

  1. OC语言的动态性怎么解释
    答:他的对象类型和真正要调用的方法是在运行时才确定的,所以这就决定了在oc中没有绝对的私有变量和私有方法的,通过运行时机制runtime我们可以动态的去对类中所有的变量和方法动手脚

引用:

iOS成员变量和属性的区别
iOS 成员变量 实例变量 属性变量
IOS 成员变量,全局变量,局部变量定义,static与extern的区别
iOS 修饰词 详解
[爆栈热门 iOS 问题] atomic 和 nonatomic 有什么区别?

上一篇 下一篇

猜你喜欢

热点阅读