strong 表示指向并拥有该对象。其修饰的对象引用计数会增加1。该对象只要引用计数不为0则不会被销毁。当然强行将其设为nil可以销毁它。
weak 表示指向但不拥有该对象。其修饰的对象引用计数不会增加。无需手动设置,该对象会自行在内存中销毁。
assign 主要用于修饰基本数据类型,如NSInteger和CGFloat,这些数值主要存在于栈上。assign修饰的对象被释放后,指针的地址依然存在,造成野指针,在堆上容易造成崩溃。而栈上的内存系统会自动处理,不会造成野指针。
copy 与strong类似。不同之处是strong的复制是多个指针指向同一个地址,而copy的复制每次会在内存中拷贝一份对象,指针指向不同地址。copy一般用在修饰有可变对应类型的不可变对象上,如NSString, NSArray, NSDictionary。
__weak与weak基本相同。前者用于修饰变量(variable),后者用于修饰属性(property)。__weak 主要用于防止block中的循环引用。
__block也用于修饰变量。它是引用修饰,所以其修饰的值是动态变化的,即可以被重新赋值的。__block用于修饰某些block内部将要修改的外部变量。__weak和__block的使用场景几乎与block息息相关。而所谓block,就是Objective-C对于闭包的实现。闭包就是没有名字的函数,或者理解为指向函数的指针。
atomic 修饰的对象会保证setter和getter的完整性,任何线程对其访问都可以得到一个完整的初始化后的对象。因为要保证操作完成,所以速度慢。它比nonatomic安全,但也并不是绝对的线程安全,例如多个线程同时调用set和get就会导致获得的对象值不一样。原子性:默认为atomic,他保证了程序在运行期间,不会出现某一条线程还没有执行完set方法,另一条就执行的情况发生,就相当于在函数的开头加了一条同步锁,这样会保证线程的安全,但是由于只能有一条线程访问,效率就大大降低了
nonatomic 修饰的对象不保证setter和getter的完整性,所以多个线程对它进行访问,它可能会返回未初始化的对象。正因为如此,它比atomic快,但也是线程不安全的。非原子性:多条线程并发执行,效率相对原子性atomic高很多。
synchronized 代表这个方法加锁, 相当于不管哪一个线程(例如线程A),运行到这个方法时,都要检查有没有其它线程例如B正在用这个方法,有的话要等正在使用synchronized方法的线程B运行完这个方法后再运行此线程A,没有的话,直接运行。它包括两种用法:synchronized 方法和 synchronized 块。synchronized 方法控制对类(一般在IOS中用在单例中)的访问:每个类实例对应一把锁,每个 synchronized 方法都必须获得调用该方法锁方能执行,否则所属就会发生线程阻塞,方法一旦执行,就独占该锁,直到从该方法返回时才将锁释放,此后被阻塞的线程方能获得该锁,重新进入可执行状态。这种机制确保了同一时刻对于每一个类,至多只有一个处于可执行状态,从而有效避免了类成员变量的访问冲突(只要所有可能访问类的方法均被声明为 synchronized)。
readonly 此标记说明属性是只读的,默认的标记是读写,也就是只会生成get方法。
readwrite 此标记说明属性会被当成读写的,这也是默认属性,表示既可以赋值,也可以被赋值。
synthesize 如果不实现setter和getter方法,将按照编译器的规则自动生成setter和getter方法。
dynamic 直接或动态的执行setter和getter方法.通常自己实现setter和getter方法,我们基本上不会用到。
@interface 声明一个类。
@implementation 实现这个类。
@protocol 声明协议。
@optional 与@protocol配合使用,说明协议中的某个或者某几个方法可以不实现。
@required 与@protocol配合使用,说明协议中的某个方法或者某几个方法必须实现。
@end 与@interface ,@implementation,@protocol配合使用,代表声明或者实现结束。
id 是指向Objective-C类对象的指针,它可以声明为任何类对象的指针,当在Objective-C中使用id时,编译器会假定你知道,id指向哪个类的对象。与void是不同的是,void编译器不知道也不假定指向任何类型的指针。
nil 定义为一个常量,如果一个指针的值为nil,代表这个指针没有指向任何对象。
self 在Objective-C中,关键字self与c++中this是同一概念,就是类对象自身的地址,通过self可以调用自己的实例变量和方法。
Super 当子类需要调用父类的方法时,会用到Super关键字. Super指向的是父类的指针,子类重写父类的方法时,调用父类的方法是一个比较好的习惯。因为当我们不知道父类在该方法中实现的功能时,如果不调用父类的方法,有可能我们重写的方法会失去该功能,这是我们不愿意看到的情况。
网友评论