第八讲.属性(@proporty,@synthsize) , 属性的attribute, 点语法,kvc

一.属性

1>.属性为实例变量提供了setter,getter方法的默认实现. 使用@Property,@sythesize能在一定程度上简化程序代码,并且增强实例变量的访问安全性

2>. 属性的声明:使用@property声明属性(例如:@property NSString *name;)  该关键字可以自动生成某个成员变量的setter和getter方法的声明

相当于@interface中声明了两个方法:
                           - (void)setName:(NSString *)name;
                           - (NSString *)name;

属性的实现:使用@synthesize实现属性(例如:@synthesize name = _name)该关键字帮助生成成员变量的setter和getter方法的实现
           相当于@implementation实现了:
                    - (void)setName:(NSString *)name;
                    - (NSString *)name;

属性的使用注意:首先,@properety和@sythesize配合使用,可取代setter/gstter的声明与使用.并且可以用","连用.  其次,最终可以简化成只有@property声明,就可以完成对整个setter/getter声明实现的全过程,但是注意这种方式生成的成员变量是private的。(@property int age;这句话完成了3个功能:1)生成_age成员变量的get和set方法的声明;2)生成_age成员变量set和get方法的实现;3)生成一个_age的成员变量)

3>重命名setter和getter的方法

.h 文件内的重命名声明

main.m文件内的调用形式

实例:此实例在学习属性的同时,帮助回顾初始化,和遍历构造器的使用

Teacher.h文件

Teacher.m文件

main.m文件

二.属性的属性

1 .可读性: readonly  、readwrite
   1>.@property(readwrite,....)
valueType value;
   readWrite 属性是变量的默认属性,就是如果你(readwrite and readonly 都没有使用,那么你的变量就是readwrite属性),通过加入readwrite属性你的变量就会有get方法,和set方法。
   2>.property(readonly,...) valueType
value;
这个属性变量就是表明变量只有可读方法,也就是说,你只能使用它的 get 方法。

main.m调用

2.第二类.原子性控制(nonatomic  atomic)

atomic : setter,getter方法在多线程访问下是绝对安全的,即setter,getter内部做了多线程访问处理,但是它需要对setter,getter加锁解锁以保证线程访问的安全,会很占用系统资源,降低系统性能.

nonatomic : 通常设置为nonatomic,此为非原子性访问,不加同步,多线程并发访问会提高性能。在此方法中,setter,getter方法内部不会做多线程访问处理,仅仅是普通的setter,getter方法,nonatomic为默认的设置形式.
    
注意点:  1>.如果不加此属性,则默认是两个访问方法都为原子型事务访问。锁被加到所属对象实例级
。 所以 不加 nonatomic 对多线程是安全的   。

2>.(nonatomic)非原子性访问,对属性赋值的时候不加锁,多线程并发访问会提高性能。如果不加此属性,则默认是两个访问方法都为原子型事务访问。

扩展:atomic是Objc使用的一种线程保护技术,基本上来讲,是防止在写未完成的时候被另外一个线程读取,造成数据错误。而这种机制是耗费系统资源的,所以在iPhone这种小型设备上,如果没有使用多线程间的通讯编程,那么nonatomic是一个非常好的选择。

3.第三类.语义设置( assign,retian,copy)

assign   用于基本数据类型即非对象类型(如int,float等).此为默认设置形式.此方法对setter,getter方法直接赋值,不进行任何retain操作,为了解决原类型与环循引用问题.

扩展:在使用垃圾收集的应用程序中,如果你要一个属性使用assign,且这个类符合NSCopying协议,你就要明确指出这个标记,而不是简单地使用默认值,否则的话,你将得到一个编译警告。这再次向编译器说明你确实需要赋值,即使它是可拷贝的。

retain:set方法的实现是release旧值,retain新值,所有实现都是这个顺序.用于OC对象类型(NSString ,NSSarray等)

扩展:指定retain会在赋值时唤醒传入值的retain消息。此属性只能用于Objective-C对象类型,而不能用于Core Foundation对象。(原因很明显,retain会增加对象的引用计数,而基本数据类型或者Core Foundation对象都没有引用计数——译者注)。

copy:set方法的实现是release旧值,copy新值,用于NSString、block等类型.,属性是对象类型并且想得到参数的copy,就是用copy关键字

扩展:setter 方法进行 Copy 操作,与 retain 处理流程一样,先旧值 release ,再 Copy 出新的对象, retainCount 为 1 。这是为了减少对上下文的依赖而引入的机制。它指出,在赋值时使用传入值的一份拷贝。拷贝工作由copy方法执行,此属性只对那些实行了NSCopying协议的对象类型有效。更深入的讨论.

附网文:
Retain vs. Copy
    copy  :  
建立一个索引计数为 1 的对象,然后释放旧对象
    retain  :释放旧的对象,将旧对象的值赋予输入对象,再提高输入对象的索引计数为 1
    Copy其实是建立了一个相同的对象,而 retain不是:比如一个 NSString 对象,地址为 0×1111,内容为 @”STR”Copy到另外一个NSString之后,地址为 0×2222,内容相同,新的对象 retain为1,旧有对象没有变化,   而retain到另外一个 NSString之后,地址相同(建立一个指针,指针拷贝),内容当然相同,这个对象的retain值 +1.也就是说,retain是指针拷贝,copy是内容拷贝。

示例代码:

assign,retain,copy方法实例应用(面试题)

三.点语法的使用

    1. 凡是符合系统默认的setter、getter书写格式的方法都可以使用点语法
    2. 例如:
      [person
      setName:@"小七"];
      等价于:person.name
      =
      @"小七";

      NSString *name = [person name]; 等价于:NSString
      *name
      = person.name;

    3. 属性是getter、setter方法,点语法是属性的另一种调用格式。

注意:只有在声明setter和getter(或@property,@sythsize)的基础之上才能使用点语法.没有相应的setter/getter声明不能使用点语法,因为点语法本质上只是的另一种调用形式.

示例代码:

重点理解和常见错误

四.KVC

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

核心关键语法: 1>.setValue: forkey:

2>.valueForKey:

2>.当key不存在的时候,会执行setValue:forUndefinedKey:

此种情况用于网络请求数据时,有时没有对应key值,所以为防止程序崩溃而使用,(只写格式就起作用)

时间: 2024-08-05 17:50:23

第八讲.属性(@proporty,@synthsize) , 属性的attribute, 点语法,kvc的相关文章

《ArcGIS Engine+C#实例开发教程》第八讲 属性数据表的查询显示

原文:<ArcGIS Engine+C#实例开发教程>第八讲 属性数据表的查询显示 第一讲 桌面GIS应用程序框架的建立 第二讲 菜单的添加及其实现 第三讲 MapControl与PageLayoutControl同步 第四讲 状态栏信息的添加与实现 第五讲 鹰眼的实现 第六讲 右键菜单添加与实现 教程Bug及优化方案1 第七讲 图层符号选择器的实现1 第七讲 图层符号选择器的实现2 第八讲 属性数据表的查询显示 摘要:这一讲中,我们将实现图层属性数据表的查询显示.在ArcMap中,单击图层右

第八讲:HTML5中canvas实现小球击打小方块游戏

源代码:http://download.csdn.net/detail/liumingm900913/7469969 游戏开发流程: 1.创建画布: 将画布放在div标签里面,这样可以控制画布居中的位置,在对div标签加上一些样式,利于观看 <div id="main"> <!--将画布嵌在div块里面,使其可以居中--> <canvas id="liuming_canvas" width="300px" heigh

蓝鸥零基础学习HTML5第八讲 样式布局一

蓝鸥零基础学习HTML5第八讲 样式布局一 1.浮动到底是什么鬼 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Document</title> <style> /*body { font-size:0px; }*/ div { width:100px; height:100px; text-align: center; line

蓝鸥零基础学习HTML5第八讲 样式布局二

蓝鸥零基础学习HTML5第八讲 样式布局二 1.定位的属性及特性 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Document</title> <style> #box1 { width:400px; height:400px; border:10px solid red; margin:0 auto; position: re

深入理解css中position属性及z-index属性

深入理解css中position属性及z-index属性 在网页设计中,position属性的使用是非常重要的.有时如果不能认识清楚这个属性,将会给我们带来很多意想不到的困难. position属性共有四种不同的定位方法,分别是static.fixed.relative.absolute.最后将会介绍和position属性密切相关的z-index属性. 第一部分:position: static static定位是HTML元素的默认值,即没有定位,元素出现在正常的流中,因此,这种定位就不会收到t

Activity之taskAffinity属性、allowTaskReparenting属性和Android退出整个应用解决方案

allowTaskReparenting属性 属性: android:allowTaskReparenting 除了launchMode可以用来调配Task,的另一属性taskAffinity,也是常常被使用.taskAffinity,是一种物以类聚的思想,它倾向于将taskAffinity属性相同的Activity,扔进同一个Task中.不过,它的约束力,较之launchMode而言,弱了许多.只有当中的allowTaskReparen ting设置为true,抑或是调用方将Intent的fl

【拼爹坑爹不比爹】深入理解css中position属性及z-index属性

总结:拼爹坑爹不比爹 1,定位移动:距左上角left+top;(移动后对于移动前:如果值为负数,则直接换成整数:如果值为整数,则直接改变相对方向.)2,单一父元素不设值,子z-index才奏效:"不比爹"3,多个父元素,"拼爹坑爹"(子凭父贵,子贵父不贵)(爹设值,因外有body)4,多个父元素多子元素,各父各子高低相互比,就是不比爹:>< [转]深入理解css中position属性及z-index属性 在网页设计中,position属性的使用是非常重要

CSS属性:背景属性(图文详解)

本文最初发表于博客园,并在GitHub上持续更新前端的系列文章.欢迎在GitHub上关注我,一起入门和进阶前端. 以下是正文. background系列属性 常见背景属性 CSS样式中,常见的背景属性有以下几种:(经常用到,要记住) background-color:#ff99ff; 设置元素的背景颜色. background-image:url(images/2.gif); 将图像设置为背景. background-repeat: no-repeat; 设置背景图片是否重复及如何重复,默认平铺

python 对象属性与类属性

class Person(object): # 这里的属性实际上属于类属性(用类名来调用) name = "person" def __init__(self, name): pass #对象属性 self.name = name print(Person.name)per = Person("tom")#对象属性的优先级高于类属性print(per.name)#动态的给对象添加对象属性per.age = 18#只针对于当前对象生效,对于类创建的其他对象没有作用pr