property
在之前的学习和运用当中,由于成员变量默认都是私有的(private),所以定义一个变量的时候都会手写出一段『getter』和『setter』的代码。但是由于这样写太麻烦了,所以引入了property(声明)和synthesize(实现)。而到了后来,synthesize也被省略掉了。
eg: @property (nonatomic, strong)NSString *name;
这里,『property』帮我们完成了三个任务:1.声明了一个属性变量
2.声明了setter、getter方法
3.实现了setter、getter方法
property中的关键字的:
atomic 原子操作 线程安全 有枷锁解锁机制 安全 (默认)
nonatomic 非原子操作 线程不安全 速度快 效率高 (一般使用)
strong 声明一个非自己创建的对象的所有权
如果创建所有权之后 放弃只会放弃所有权,而不会释放内存 所有的都放弃所有权之后 系统会自动释放内存
防止A创建物体后B使用,A放弃了之后,B就再也找不到了这种情况。
retain 和strong一样
weak 只使用而不产生所有权
copy 重新复制对象 好处在于和原来的对象脱离了关系不受其影响 坏处在于内存加大了
与Strong的区别就是是否脱离出来
assign 对于C语言的基本数据类型用assign
readonly 只读 相当于只提供getter方法
readwrite 读写 默认
init
init自定义个目的相当于构造方法,有的时候初始化的时候有一些默认值,还有就是页面加载数据的时机问题,防止加载了页面再填数据(不同步)。
eg:
-(instancetype)initWithName:(NSString *)aName andage:(int)aAge{ if (self =[super init]) { //调用父类方法init 并且判断是否初始化成功 self.name = aName; self.age = aAge; } return self; }
自定义的时候可以有三种返回类型使用意义相同
-(Person *)initWithName
-(id)initWithName //id是identify的缩写,某种程度上相当于void
-(instancetype)initWithName //是NSObject中init的类型,推荐使用
class
@class 类名;——解决循环引用问题,提高性能
@class仅仅告诉编译器,在进行编译的时候把后面的名字作为一个类来处理。
(1)@class的作用:声明一个类,告诉编译器某个名称是一个类
(2)开发中引用一个类的规范
1)在.h文件中使用@class来声明类
2)在.m文件中真正要使用到的时候,使用#import来包含类中的所有东西
P.S.例如钥匙类中会包含锁,锁中又包含钥匙。相互#import会出错 因为一直互相引用