1.ARC下是否有内存溢出等问题 2.@property参数 3.#import和@class的区别

1.ARC下是否有内存溢出等问题?

  答案:必须要担心啊,ARC也不是万能的。答案:必须要担心啊,ARC也不是万能的。这里主要是涉及到集合类的数据类型

       比如数组,我们定义了一个可变数组muarr1,然后把一个对象p1加到muarr1中,此时会对这个对象 retain一次,相当于retainCount+1,

      只有当这个数组removeObject:p1删除这个对象时、或者这个数组自己 muarr1=nil;了,或者这个数组removeAllObjects时,

             它才会对这个对象或者里面所有对象release一次。

2.@property参数

  一:1)是否要生成set方法(若为只读属性,则不生成) 

    readonly:只读,只会生成getter的声明和实现 
    readwrite:默认的,同时生成setter和getter的声明和实现 


     2)多线程管理(苹果在一定程度上屏蔽了多线程操作) 
    nonatomic:高性能,一般使用这个 
    atomic:低性能,默认 


     3)内存管理相关参数 
    retain: 对对象release旧值,retain新值(适用于OC对象类型) 
    assign: 直接赋值(默认,适用于非oc对象类型) 
    copy: release旧值,copy新值 
    验证assign如果作用在对象上,实际上就是直接赋值 


     4)set和get方法的名称 
    修改set和get方法的名称,主要用于布尔类型。因为返回布尔类型的方法名一般以is开头,修改名称一般用在布尔类型中的getter。 
    @property(nonatomic,assign, setter=abc:,getter=haha)int age

  二、ARC下@property参数 
      ARC中的@property
      strong : 用于OC对象, 相当于MRC中的retain
      weak : 用于OC对象, 相当于MRC中的assign
      assign : 用于基本数据类型, 跟MRC中的assign一样
      copy : 一般用于NSString, 跟MRC中的copy一样 
      在ARC情况下解决”循环retain”的问题:
      @property一边用strong,一边用weak。

  三.1,getter=getterName,setter=setterName,设置setter与getter的方法名,除非你想自己取名,否则一般使用默认的名字即可。以免造成混乱。

      2,readwrite,readonly (只生成getter方法),设置可供访问级别的限制。
      2,assign,调用setter方法时直接赋值,不进行任何retain操作。
      3,retain,调用setter方法时,先release旧值,然后对赋予的新值执行retain,相当于一次指针的拷贝。
      4,copy,setter方法进行Copy操作,与retain处理流程一样,先release旧值,再Copy出新的对象,retainCount为1。其实是建立一个新的对象。
      5,nonatomic,非原子性访问,不加同步,多线程并发访问会提高性能。atomic是Objc使用的一种线程保护技术,基本上来讲,是防止在写未完成的时候被另外一个线程读取,

    造成   数据错误。而这种机制是耗费系统资源的,所以在iPhone这种小型设备上,如果没有使用多线程间的通讯编程,那么nonatomic是一个非常好的选择。

3.#import和@class的区别。 
    1.作用上的区别 
    #import会包含引用类的所有信息(内容), 包括引用类的变量和方法 
    @class仅仅是告诉编译器有这么一个类, 具体这个类里有什么信息, 完全不知 

    2.效率上的区别 
    如果有上百个头文件都#import了同一个文件,那么一旦最开始的头文件稍有改动,后面引用到这个文件的所有类都需要重新编译一遍 , 编译效率非常低 相对来讲,

    使用@class方式就不会出现这种问题了

原文地址:https://www.cnblogs.com/jiayongqiang/p/5095601.html