• Objective-C 快速入门--基础(五)


    1、什么是属性?属性会帮我们做哪些事情?请详细说明。

      (1)①属性是Objective-C 2.0定义的语法,为实例变量提供了setter、getter方法的默认实现;②能在一定程度上简化程序代码,并且增强实例变量的访问安全性。

      (2)①属性会对于你声明的实例变量,它会默认帮你补齐你所需要的(你没有声明的,或者你没有实现的)getter,setter方法;②如果你不满意系统默认生成的getter,setter方法 需要同时重写一个实例变量的getter,setter方法,这时就需要注明 @synthesize  然后用实例变量去赋值属性名 // name = _name 不要写反。

    2、什么是Attribute?属性的Attribute有几大类?都有什么作用?

      (1)Objective-C提供属性的目的是为了简化程序员编码,并且为属性提供了一些关键字用以控制setter、getter的实现细节,这些关键字我们称为属性的属性(Attribute);

      (2)一共3大类Attribute;

      (3)第一类:读写性控制(readonly、readwrite、setter、getter)

          ①readonly,告诉编译器,只声明getter方法(无setter方法)。

           例如:@property(readonly)NSString *name;  //等价于:- (NSString *)name;

          ②readwrite,告诉编译器,既声明setter又声明getter。

           例如: @property(readwrite)NSString *name;  //等价于:- (void)setName:(NSString *)name;  - (NSString *)name;

          ③readwrite是读写性控制的默认设置。

        第二类:原子性控制(nonatomic、atomic)

          ①atomic:setter、getter方法在多线程访问下是绝对安全的,即 setter、getter内部做了多线程访问处理(原子性控制的默认设置是 atomic);

          ②nonatomic:setter、getter方法内部不会做多线程访问处理,仅仅是普通的setter、getter方法;

        注意:①程序开发过程中,setter、getter处处都在用,如果使用atomic,需要不断的对setter、getter加锁解锁以保证线程访问安全,会很占用系统资源,降低系统性能;

           ②通常设置为nonatomic,某些属性需要线程安全的时候,才定义为atomic。

           例如:例如:@property (readwrite,nonatomic)NSString *name;  //等价于:- (void)setName:(NSString *)name;  - (NSString *)name;

        第三类:语义设置(assign、retain、copy)

          ①assign。setter、getter内部实现是直接赋值。

          示例:例如:@property(nonatomic,assign)int age;

          

          ②retain。setter、getter的内部实现会做内存优化。

          示例:例如:@property(nonatomic,retain)NSString *name;

          

          ③copy。setter、getter的内部实现也会做内存优化。

          示例:例如:@property(nonatomic,copy)NSString *name;

          

        提示:①如果属性是非对象类型(比如int,float等)属性的语义设置使用assign;

           ②如果属性是对象类型(比如NSStrng、NSArray等)属性的语义设置使用retain;

           ③如果属性是对象类型并且想得到参数的copy,使用copy关键字。

    3、要想使用点语法必须要满足什么条件?

      凡是符合系统默认setter、getter书写格式的方法都可以使用点语法。

      例如:[person setName:@"zhangsan"];  可以等价写成   person.name = @"zhangsan";

         NSString *name = [person1 name];  可以等价写成  NSString *name = person1.name;

    4、使用点语法的实质就是在调用setter,getter方法.那什么时候是在调用setter方法,什么时候是在调用getter方法呢?

      有赋值操作就是在调用setter方法,   没有赋值只是当做一个值使用的时候就是调用getter方法。

    5、KVC的全称是什么?

      KVC全称:(Key-Value-Coding),键值编码,是一种间接访问实例变量的方法。 key:键,用于标识实例变量;vlaue:实例变量对应的值。

    6、在KVC中,给对象的一个实例变量赋值,用什么方法?

      ①普通键值:setValue:forKey:

      ②有层级关系的赋值:比如:学生的老师的女朋友 [stu tea.gf]   就用:setValue:forKeyPath:

    7、在KVC中,如果在赋值或取值过程中,key所对应的实例变量不存在,执行的结果是什么?如何避免?

      当key不存在 防止崩溃 就在对应的类.m文件中重写setter方法就用 setValue:forUndefinedKey:

      示例:

      

    8、在KVC中给一个对象的实例变量批量赋值采用什么方法?

      批量赋值 把键值对存放在字典里 然后直接赋值字典 就用 setValuesForKeysWithDictionary:

     Email:dingding3w@126.com

  • 相关阅读:
    ORACLE 计算时间相减间隔
    oracle中游标详细用法
    oracle中计算某月的天数
    Unity3D导出的EXE不用显示分辨率选择界面
    Unity3D 之暂停和继续的实现
    double的值太大,以及补0
    Unity3D鼠标点击物体产生事件
    java POi excel 写入大批量数据
    Unity3D 判断鼠标是否按在UGUI上
    Unity3D 之UGUI 滚动条
  • 原文地址:https://www.cnblogs.com/dingding3w/p/4619657.html
Copyright © 2020-2023  润新知