zoukankan      html  css  js  c++  java
  • IOS之@property 的理解

    大神的bolg:
    http://www.cocoachina.com/ios/20150803/12872.html
     
     


    @synthesize合成实例变量的规则是什么?
    @synthesize表示由编译器来自动实现属性的getter/setter方法,不需要你自己再手动去实现。默认情况下,不需要指定实例变量的名称,编译器会自动生成一个属性名前加“_”的实例变量。当然也可以在实现代码里通过@synthesize语法来指定实例变量的名字。
     

    @synthesize和@dynamic分别有什么作用?

    简单来讲,通过@synthesize指令告诉编译器在编译期间产生getter和setter方法。如果自定义getter和setter方法则会覆盖编译器帮我们生成的方法。
    @dynamic指令告诉编译器在编译期间不自动生成getter和setter方法,避免编译期间产生警告。然后由自己实现存取方法或存取方法在运行时动态创建绑定。其主要作用就是用在NSManageObject对象的属性声明中,由于此类对象的属性一般是从Core Data的属性中生成的,Core Data框架会在程序运行的时候为此类属性生成getter和setter方法。

    atomic与nonatomic
    atomic:默认是有该属性的,这个属性是为了保证程序在多线程情况下,编译器会自动生成一些互斥加锁代码,避免该变量的读写不同步的问题,提供多线程安全。
    nonatomic:如果该对象无需考虑多线程的情况,请加入这个属性,这样会让编译器少生成一些互斥加锁代码,禁止多线程,变量保护,提高性能和效率。
    注:
    atomic是Objc使用的一种线程保护技术,基本上来讲是防止在写未完成的时候另一个线程读取,造成的数据错误。而这种机制是非常耗费系统资源的,所以iPhone这种小型设备上,如果没有使用多线程间的通讯编程,那么nonatomic是一个非常好的选择。而iOS开发中,普遍使用nonatomic也是基于性能这一点。
     
    weak属性需要在dealloc中置nil么?
    不用。系统会自动帮你管理。注意循环引用的出现,和无法被销毁的对象的处理就好。

    @property 的本质是什么

      @property = ivar + getter + setter;

    “属性” (property)有两大概念:ivar(实例变量)、存取方法(access method = getter + setter)。

    “属性” (property)作为 Objective-C 的一项特性,主要的作用就在于封装对象中的数据。 Objective-C 对象通常会把其所需要的数据保存为各种实例变量。实例变量一般通过“存取方法”(access method)来访问。其中,“获取方法” (getter)用于读取变量值,而“设置方法” (setter)用于写入变量值。这个概念已经定型,并且经由“属性”这一特性而成为Objective-C 2.0的一部分。 而在正规的 Objective-C 编码风格中,存取方法有着严格的命名规范。 正因为有了这种严格的命名规范,所以 Objective-C 这门语言才能根据名称自动创建出存取方法。其实也可以把属性当做一种关键字,其表示:

    ARC下,不显示指定任何属性关键字时,默认的关键字都有哪些?

    • 对应基本数据类型默认关键字是

    atomic,readwrite,assign

    • 对于普通的OC对象

    atomic,readwrite,strong

    @synthesize和@dynamic分别有什么作用?

    1)@property有两个对应的词,一个是@synthesize,一个是@dynamic。如果@synthesize和@dynamic都没写,那么默认的就是@syntheszie var = _var;

    2)@synthesize的语义是如果你没有手动实现setter方法和getter方法,那么编译器会自动为你加上这两个方法。

    3)@dynamic告诉编译器:属性的setter与getter方法由用户自己实现,不自动生成。(当然对于readonly的属性只需提供getter即可)。假如一个属性被声明为@dynamic var,然后你没有提供@setter方法和@getter方法,编译的时候没问题,但是当程序运行到instance.var = someVar,由于缺setter方法会导致程序崩溃;或者当运行到 someVar = var时,由于缺getter方法同样会导致崩溃。编译时没问题,运行时才执行相应的方法,这就是所谓的动态绑定。

    在有了自动合成属性实例变量之后,@synthesize还有哪些使用场景?

    回答这个问题前,我们要搞清楚一个问题,什么情况下不会autosynthesis(自动合成)?

    • 同时重写了setter和getter时

    • 重写了只读属性的getter时

    • 使用了@dynamic时

    • 在 @protocol 中定义的所有属性

    • 在 category 中定义的所有属性

    • 重载的属性

    当你在子类中重载了父类中的属性,你必须 使用@synthesize来手动合成ivar。

    除了后三条,对其他几个我们可以总结出一个规律:当你想手动管理@property的所有内容时,你就会尝试通过实现@property的所有“存取方法”(the accessor methods)或者使用@dynamic来达到这个目的,这时编译器就会认为你打算手动管理@property,于是编译器就禁用了autosynthesis(自动合成)。

  • 相关阅读:
    打造jQuery的高性能TreeView
    结构化日志类库 ---- Serilog库
    项目管理上的失误和应对措施
    Android分类导航
    Android破解
    Android开发入门
    安装 Android Studio 2.3 详细过程及错误解决
    Python学习思维导图
    设计模式的六大原则 ---- 理论知识
    日志的艺术(The art of logging)
  • 原文地址:https://www.cnblogs.com/Biaoac/p/5288350.html
Copyright © 2011-2022 走看看