基本语法备忘
修饰词
property & synthesize
https://www.jianshu.com/p/e27fe4be61af
readwrite:可以产生和使用getter和setter方法.
readonly:只产生和使用getter方法,不能产生和使用setter方法.
assign:默认类型,在setter中直接进行赋值使用的,不进行retain操作
retain:setter方法中,对参数进行release释放旧值,再retain新值.释放旧对象,将旧对象的值赋予输入对象,再提高输入对象的引用计数为1.
copy:setter方法进行copy操作,与retain一样, 建立一个引用计数为1的对象,然后释放旧对象
nonatomic:禁止多线程,变量保护,提高性能
atomic:系统默认,这个属性是为了保证程序在多线程情况,编译器会自动生成一些互斥加锁代码,避免该变量的读写不同步问题。
strong:强引用,也是我们通常说的引用,其存亡直接决定了所指向对象的存亡,如果不存在指向一个对象的引用,并且此对象不再显示在列表中,则此对象会被从内存中释放.
weak:弱引用,不决定对象的存亡,即使一个对象被持有无数个弱引用,只要没有强引用指向它,那么还是会被清除
setter=: 对setter方法重新定义一个名字.
getter=: 对getter方法重新定义一个名字.
nonatomic&atomic
atomic:默认是有该属性的,这个属性是为了保证程序在多线程情况下,编译器会自动生成一些互斥加锁代码,避免该变量的读写不同步问题。
nonatomic:如果该对象无需考虑多线程的情况,请加入这个属性,这样会让编译器少生成一些互斥加锁代码,可以提高效率。
readonly & readwrite
readwrite(默认):readwrite是默认的,表示同时拥有setter和getter。
readonly: readonly 表示只有getter没有setter。
有时候为了语意更明确可能需要自定义访问器的名字:
@property (nonatomic, setter = mySetter:,getter = myGetter ) NSString *name;
最常见的是BOOL类型,比如标识View是否隐藏的属性hidden。可以这样声明
@property (nonatomic,getter = isHidden ) BOOL hidden;
要注意修改setter或者getter的名字是存在副作用的,可能会使KVC和KVO无法正常工作。
instancetype
得到的返回类型和方法所在类的类型相同
https://blog.csdn.net/wzzvictory/article/details/16994913
id(相当于void*),id<>模版用法?
https://blog.csdn.net/totogo2010/article/details/7714960
https://blog.csdn.net/LonelyRoamer/article/details/7711895
id 和void *并非完全一样。下面是id在objc.h中的定义:
typedef struct objc_object {
Class isa;
} *id;
从上面看出,id 是指向struct objc_object 的一个指针。也就是说,id 是一个指向任何一个继承了Object(或者NSObject)类的对象。需要注意的是id 是一个指针,所以在使用id的时候不需要加星号,比如,
id foo=nil;
isKindOfClass & isMemberOfClass
https://blog.csdn.net/totogo2010/article/details/7714960
-(BOOL) isKindOfClass: classObj判断是否是这个类或者这个类的子类的实例
-(BOOL) isMemberOfClass: classObj 判断是否是这个类的实例(不包括子类)
respondsToSelector & instancesRespondToSelector
https://blog.csdn.net/totogo2010/article/details/7714960
-(BOOL) respondsToSelector: selector 判读实例是否有这样方法
+(BOOL) instancesRespondToSelector: 判断类是否有这个方法。此方法是类方法,不能用在类的对象
import
和#include类似,但是保证头文件只包含一次。
这个和C++里的#pragma once宏一样的作用