zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    yolo_to_onnx ValueError: need more tan 1 value to unpack
    yolo_to_onnx killed
    C++ 实现二维矩阵的加减乘等运算
    Leetcode 1013. Partition Array Into Three Parts With Equal Sum
    Leetcode 1014. Best Sightseeing Pair
    Leetcode 121. Best Time to Buy and Sell Stock
    Leetcode 219. Contains Duplicate II
    Leetcode 890. Find and Replace Pattern
    Leetcode 965. Univalued Binary Tree
    Leetcode 700. Search in a Binary Search Tree
  • 原文地址:https://www.cnblogs.com/dingding3w/p/4619657.html
Copyright © 2011-2022 走看看