iOS 关键字

2020-05-08  本文已影响0人  水中的蓝天

常用关键字理解

strongcopyweakassign

strong修饰的对象是强引用,该指针指向的对象引用计数会加1
copy修饰的对象一般为不可变数据类型,可以保证修改副本对象不影响原对象
weak修饰的对象时弱引用,该指针指向的对象引用计数不会加1
assign修饰基本数据类型如Int、CGRect、NSInteger、CGFloat、CGSize、CGSize、CGPoint等
assign不用来修饰OC是因为其不安全,不能指向的对象销毁时把指针置空;而被weak可以

nonatomicatomic
nonatomic:非原子性,不会对赋值和取值过程加锁
atomic:原子性,会对赋值和取值过程加锁
atomic加锁逻辑自iOS10之后从自旋锁变为互斥锁;
atomic加锁原理:创建一个PropertyLocks(锁缓存池),通过传入标识(self+偏移地址)锁定唯一属性的方式做到setter和getter方法同时只能有一个进行,保证安全

@synthesize 和 @dynamic的区别

// 如果指定了成员变量的名称,会生成一个指定名称的成员变量
@synthesize firstName = _myFirstName;

在有了自动合成属性实例变量之后,@synthesize还有哪些使用场景?
回答这个问题前,我们要搞清楚一个问题,什么情况下不会自动合成成员变量?

1)同时重写了 setter 和 getter 时
2)重写了只读属性的 getter 时
3)使用了 @dynamic 时
4)在 @protocol 中定义的所有属性
5)在 category 中定义的所有属性
6)重载的属性

externstatic的区别

全局变量分两种:外部变量、内部变量

外部变量:定义的变量能被本文件和其他文件访问

定义一个外部变量
 int a ;

声明一个外部变量
extern int a ;

内部变量:定义的变量只能被本文件访问,不能被其他文件访问

定义一个内部变量
static int a ;

static 对变量的作用:定义一个内部变量
extern 对变量的作用:声明一个外部变量
static对函数的作用:定义和声明一个内部函数
extern对函数的作用:定义和声明一个外部函数(可以省略不写)

const的用法 ? 作用是什么 ?

1.用法: 被用来修饰基本数据类型或指针
2.作用:被修饰的类型访问权限会变为只读


修饰基本数据类型时,基本数据类型只能被赋值一次
int const a = 1;
const int b = 2;

a = 3; //Xcode提示错误,无法修改a的值
b = 3; //Xcode提示错误,无法修改b的值

const在指针符号(*)的左边: *p指向的内存中的值为只读(int const *p和const int *p效果一致)

int a = 1;
int b = 2;
int const *p = &a; //*p访问的是a变量的值
*p = 30;  //Xcode提示错误,无法修改
p = &b; 

const在指针符号(*)的右边 : p指针中保存的内存地址为只读

int a = 1;
int b = 2;
int *const p = &a;
*p = 30; 
p = &b; //Xcode提示错误,无法修改

*const同时在指针符号()两边 : 指针指向的地址不可以改变,同时无法改变指向地址所保存的值。

int a = 1;
int b = 2;
int const * const p = &a;
*p = 30; //Xcode提示错误,无法修改
p = &b; //Xcode提示错误,无法修改

补充:static可以多次赋值,但最好不要那么做,负责会失去静态变量的意义

@private、@protected、@public、@package

@private 私有的
代表私有,也就是只有自己有,别人谁都不可用,不不可以继承的。

@protected 受保护的
相较上边的private而言,就没有那么自私了,他自己可以用,自己的子类也是可以共享的,是可以继承的.

@public 公共的
相较上边而言,谁都可以用,只要你有这个类的对象,就可以拿到public下的变量,

@package
这个主要是用于框架类,使用@private太限制,使用@protected或者@public又太开放,就使用这个package吧。

上一篇 下一篇

猜你喜欢

热点阅读