ios之property修饰符

版权声明:文章为作者良心产物,转载请注明出处. https://blog.csdn.net/u014455765/article/details/51629097

property参数

知识点

1.【掌握】控制set方法的内存管理

2.【掌握】控制需不需要生成set方法

3.【掌握】多线程管理

4.【掌握】控制set方法和get方法的名称


1.控制set方法的内存管理

  • retain: release旧值,retain新值,(用于OC对象)
  • assign: 直接赋值,不做任何内存管理(默认,用于非OC对象)
  • copy: release旧值,retain新值(一般用于 NSString *)

2.控制需不需要生成set方法

  • readwrite: 同时生成getter、setter方法(默认)
  • readonly: 只生成getter方法

3.多线程管理

  • atomic: 只能单线程进行访问和修改属性,性能低(默认)
  • nonatomic: 多线程进行访问和修改属性,性能高
  • 注意:ios开发中99.99% 都是使用nonatomic(@property(nonatomic))

4.控制set方法和get方法的名称

  • setter:设置set方法的名称,一定有个冒号

  • getter:设置get方法的名称,一般用于BOOL值类型的属性

  • 注意:不同类型的修饰符不能组合在一起使用

property 其他

  • 没有告诉@property要讲传入的参数赋值给谁,默认@property会将传入的属性赋值给_开头的成员变量

  • @propery 有一个弊端:它只会生成简单的getter/setter方法的声明和实现,并不会对传入的数据进行过滤,如果想对传入的数据进行过滤,那么我们就必须重写getter/setter方法,如果不想对传入的数据进行过滤,仅仅是提供一个方法给外界操作成员变量,那么久可以使用@property

  • 如果利用@property来生成getter/setter方法,那么我们可以不写成员变量,系统自动给我们生成一个_开头的成员变量

  • 如果重写了setter方法, 那么property就只会生成getter方法

  • 如果重写了getter方法,那么property就只会生成setter方法

  • 如果同时重写了getter/setter方法,那么property就不会自动帮我们生成私有的成员变量(_xx就不可以使用)

注意

  • @propery 自动帮我们生成的成员变量是一个私有的成员变量,也就是说在.m文件中生成的,而不是在.h文件生成的,在.m文件中可以访问,在其他文件中不可以访问

property 属性修饰符

  • 如果给一个属性同时提供了getter/setter方法,那么我们就称这个属性为可读可写属性
  • 如果只提供了getter方法,那么我们称这个属性为只读属性
  • 如果只提供了setter方法,那么我们称这个属性为只写属性
  • 如果既没有提供getter也没有提供setter方法, 那么我们称这个属性为私有属性

  • 格式:

    • @property(属性修饰符) 数据类型变量名称;
  • readwrite: 代表生成getter、setter方法。(默认情况下 @property 就是readwrite)例:@property(readwrite) int age;

  • readonly: 代表生成getter方法,不生成setter方法。例:@property(readonly) NSString *name;
  • 自定义setter/getter方法名
    • 格式:@property(setter=xxx:) double sex; @property(getter=isMarried) BOOL married;
    • 一般BOOl类型的属性才需要自定义getter方法名,因为这样提高代码阅读性(判断是否结婚:之前: [xxx married]; 之后: [xxx isMarried];)

使用场景

  • copy:一般用于NSString/block
  • strong:一般用于除了NSString/block之外的oc对象
  • weak: 一般用于代理/UI控件,当两个对象相互引用(例如控件和控件的代理),一个用strong, 一个用weak,避免循环引用。
  • assign:基本数据类型,结构体、枚举、(非oc对象)
展开阅读全文

没有更多推荐了,返回首页