美文网首页
@property 修饰符

@property 修饰符

作者: 三三At你 | 来源:发表于2017-05-11 21:58 被阅读0次

@property 修饰符

修饰符的作用都是针对系统生成的getter、setter方法,对于自定义getter、setter的对象只能起到参考的作用,直接使用(_变量名)同样不受关键字的影响。

关键字 基本类型 Objective-C对象 Block Core Foundation对象
assign
weak
strong √(=copy)
retain √(warning)
copy
atomic
noatomic

注:对于Objective-C对象,Block,strong为默认修饰符,其他类型默认用assign修饰,assgin,strong不可共存。

基本类型int,float,double等

  1. 基本类型不受ARC管理,由系统自动回收栈内存。
  2. 用assign作为属性默认值,即getter、setter不做任何多余处理。
  3. 默认支持线程保护,保护getter、setter的完整性。

Objective-C对象

  1. Objective-C对象受到ARC管理,根据引用计数自动回收内存。
  2. assign与weak
  • 相同点:不增加引用计数
  • 不同点:weak引用计数为0时会把指针指向nil,assgin会产生野指针。
  1. strong与retain
  • 特点:引用计数都增加+1,对于Objective-C对象strong=retain,但是对于Block不同,下面再说。
  1. copy
  • copy比较复杂,先说一下我理解copy的语意,对于用copy修饰的对象。在setter中赋值a = b时候是有替换为a = [b copy],即调用copy方法。如果该对象没有copy方法或者没有实现NSCopying协议,使用该修饰符可以通过编译,但在运行时会报错。而对于某些NSMutable对象,例如:
NSMutableArray *a = [[NSMutableArray alloc]init];
NSMutableArray *b = [a copy];
  • 由于copy方法的特性返回的对象实际上是不可修改的,实际上就是NSArray对象。
    NSArray对象没有addObject,removeAll等方法,如果调用到必然出现运行时错误。
    对于NSString的copy方法有些特殊,例如:
@property (copy) NSString *copyStr;
NSMutableString *mStr = [NSMutableString stringWithString:@"string"];
self.copyStr = self.mStr;
[self.name2 appendString:@"11122"];
  • 这时copyStr是“string11122”还是“string”???

  • 为了处理这个特殊性,NString copy会检查一下参数类型是不是可变的。

  • 如果是可变的,进行深拷贝。

  • 如果不是可变的,进行浅拷贝效果与用strong修饰相同。

  1. 默认支持线程保护,保护getter、setter的完整性。

Block

  1. Block受到ARC管理,但于Objective-C对象有所不同,由系统自动回收内存。

  2. 虽然上面的修饰符都可以用并且通过编译,但retain会出现警告,提示用copy替换。

  • 以下是个人理解可能有误,欢迎指正。
  • block比较复杂创建的时候是在栈中,运行的时候如果没有捕获对象就在栈中运行,如果有捕获对象就先copy到堆中运行。
  1. assign,weak,retain,strong,copy
  • 都不会增加引用计数,block的引用计数始终为1。
  • 不管用那个关键字修饰可能内部实现都是一样的。
  • 但是为了更加符合语义推荐使用copy关键字。
    1. 默认支持线程保护,保护getter、setter的完整性。
  • 关于block更详细的介绍可以参考点击这里

Core Foundation对象

  1. Core Foundation对象不受ARC管理,需要使用CFRetain CFRelease手动管理内存。
  2. 用assign作为属性默认值
  3. 默认支持线程保护,保护getter、setter的完整性。

相关文章

  • @property修饰符

    本小节知识: 【掌握】@property修饰符 1.@property修饰符 修饰是否生成getter方法的rea...

  • iOS 基础知识回顾——关于 property

    目录: 本质 修饰符 synthesize, dynamic KVO 与 Property @property 本...

  • #runtime源码笔记#

    property有哪些修饰符,它们的实现原理是什么 首先回答题目的问题,property的修饰符有nonatomi...

  • 面试知识点

    1、property和属性修饰符 @property的本质是ivar(实例变量) + setter + gette...

  • 临时仓库

    @property中有哪些属性关键字?/ @property 后面可以有哪些修饰符? nonatomic atom...

  • iOS底层 - property

    @property修饰符 atomic nonatomic readwrite readonly retain a...

  • @Property剖析、以及属性关键字。

    //// @property 、属性、修饰符// Created by mac on 2016/10/30./...

  • 无标题文章

    1、@property 后面可以有哪些修饰符? 1.读写性修饰符:readwrite | readonly rea...

  • @property参数

    1.相同类型的property修饰符不能同时使用2.不同类型的property修饰符可以多个结合在一起使用, 多个...

  • iOS中修饰符的简单理解和使用

    iOS中定义属性@property需要属性修饰符。 ARC环境下:修饰符assign、strong、weak、co...

网友评论

      本文标题:@property 修饰符

      本文链接:https://www.haomeiwen.com/subject/oleatxtx.html