iOS开发中 类、对象、实例变量、成员变量、属性变量等区别和关系

摘要:
在OC中,类是表示对象类型的结构。对象通过类获取自己的信息。无法将新实例变量添加到类别中。实例变量、属性和方法可以在扩展中声明,但都是私有方法。在OC中,对象是一个包含值和指向其类的隐藏指针的结构。通过将类实例化为对象。让我们区分实例变量和成员变量:您可以看到,在interface@interface的括号中,它们统称为“成员变量”,实例变量是成员变量之一!实例变量,直接通过self-˃_变量名或变量名可以直接访问。

类(class):具有相同属性和行为等同一类元素等总称,类是一个抽象的概念。

区分是类还是对象,看它能否继续被细分。

在OC中,类是表示对象类型的结构体,对象通过类来获取自身的各种信息。类由两个部分组成:*.h和*.m文件组成。

*.m文件中 implemention部分是类的实现部分,内部包含类中的各种信息,包括各种实例方法或类方法。

类别( category):是为现有的类添加新方法的方式,通常以“类名称+类别名称”来命名。

类别中不能添加新的实例变量。但是可以在类别中添加属性。

类别在业务开发中的主要用途是:在不改变源代码原类内容的情况下,为类添加新的方法。

类扩展(class extension):类扩展是分类的一种特殊形式,扩展是没有名字的分类。文件吗通常是:“主类类名_扩展标识.h”

扩展通常定义的文件的.m中,不能分开。扩展中可以声明实例变量、属性、方法,但是全部都是私有方法。

对象(object):是不可细分,代表着某一个具体的东西的。

在OC中,对象是一种包含值和指向其类的隐藏指针的结构体。

通过将类实例化变为对象。

实例化的方法有alloc,new,copy,工厂方法,单例方法等

实例变量(instance variable):由类定义的实例话的变量(不包括基本数据类型,如int,double,float)。

成员变量(Member variable):代码中的变量,包含实例变量和基本变量类型,无需与外界接触。

成员变量默认是protected,一般情况下,非子类对象无法访问.

属性(property):编译器自动将变量的set和get方法的合成,可用点语法读取,可作为变量使用,可与外界接触。

来区别一下实例变量、成员变量的区别:

iOS开发中 类、对象、实例变量、成员变量、属性变量等区别和关系第1张

可以看到在接口 @interface 括号里面的统称为”成员变量”,实例变量是成员变量中的一种!
实例变量的英文翻译是 Instance Variable (object-specificstorage) 
实例的英文翻译为Instance(manifestation of a class) 说的是“类的表现”,说明实例变量应该是由类定义的变量!
除去基本数据类型int float ....等,其他类型的变量都叫做实例变量。
**实例变量+基本数据类型变量=成员变量**
 
@property(描述1 , 描述2 , 描述3)(class *) varName 里面,有3个描述词需要填写(也可以不填写取默认值)
1. nonatomic<-->atomic
2. readwrite<-->readonly
3. retain/copy/assign
 
首先来介绍一下:
retain:他指的是将某个内存区域的指针赋值给变量,同时把该内存区域的引用计数器加1.每执行一次,该内存区域的引用计数器就要加1,当该区域的引用计数器变为0的时候内存区域被释放!
 
copy:它指的是将目标内存区域的值复制一份,然后开辟新的内存区域(新的指针)粘贴这个值。同时变量被赋值为新内存区域的指针!
 
assign:它指的是,仅只把目标内存区域的指针赋值给变量,该内存区域的引用计数器不发生变化!
 
1、2两点不做解释,3中的retain、copy、assign都是指的,在自动生成setter函数的时候,编译器需要识别个描述词来生成对应的setter函数!需要注意的是,如果没有加上该类的描述词,系统默认该变量的setter方法采取assign的方式。
在头文件中.h一般在{}里面会有定义的实例变量 
  
 
示例:
.h
@property (automic,retain) NSString * abc;
.m
@sythesize abc;
 

//在写了@sythesize abc;的情况下,系统不会自动生成实例变量“_abc”,直接通过变量名abc ,也就是直接使用变量名在赋值运算的时候(=号左边),只是将内存区域的指针赋值给变量,相当于assgin.   如果是通过“点语句”self.abc= 来赋值,就要看在@property中定义的是copy、retain、assign哪一种了,如果没有加上上述描述词,就默认为assign

//如果没有写@sythesize abc;  系统会默认自动在.h文件{}中添加一个 不可见的 加“_”的成员变量(即使是变量名中本身就带有“_”)

//括号里面定义的都是成员变量(基本数据类型+类生成变量),里面的变量可以在.m文件中通过“变量名称”、self->“变量名称”直接访问到括号里面的变量,但是,这样的赋值访问只能是assign,原对象的引用计数器不会发生变化。

//1.@sythesize 变量名;2.@sythesize 变量名=_变量名;3.不写@sythesize (一下提到的变量名都是指的在头文件中@property 中定义的变量)

1.成员变量,实例变量通过“变量名”或者self->“变量名”直接访问到,赋值(assign)。self.变量名 实现setter,getter方法。

2.成员变量,实例变量通过“_变量名”或者self->“_变量名”直接访问到,赋值(assign)。self.变量名 实现setter,getter方法。

3.成员变量。实例变量(系统自动在原来变量名前加上“_”来生成的实例,成员变量),直接通过self->_变量名,或者变量名直接访问到(assign)。self.变量名 实现setter,getter方法。

 

如果在头文件中没有通过@property定义的变量,但是在{}中有定义成员变量,在实现文件中也也没有@sythesize ,那么可以直接通过self->“{}中的变量名”,或者直接使用“{}中的变量名”来访问赋值,这样的变量没有定义setter,getter函数,只能是assign的方式赋值。

//再来分析一下@sythesize中的写法,@sythesize abc 直接在.m文件中使用self.abc可以调用成员变量的setter、getter函数,直接调用成员变量名称abc就为访问该变量的指针,对成员变量直接赋值等同于ASSIGN效果。

http://blog.csdn.net/wangtianyong0/article/details/50472041

免责声明:文章转载自《iOS开发中 类、对象、实例变量、成员变量、属性变量等区别和关系》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇全面解决Html页面缓存的问题受限玻尔兹曼机(Restricted Boltzmann Machine,RBM)代码3下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

yaml 文件中引用变量来读取 python 代码的设置值

在接口自动化测试的时候,yaml 文件一般放测试的数据或当配置文件使用,yaml 文件存放静态的数据是没问题的,python的数据类型基本上都是支持的。有时候我们想在 yaml 文件中引用变量来读取 python 代码的设置值。 一:yaml文件中是静态数据,那么,我们用python可以正常的读取。 在接口自动化中,yaml文件保存测试数据。 我们可以用p...

vue中import和require的用法

其实用了这么久的vue,里面有很多东西都没有去细细整理分析,今天就整理一下 Import(模块、文件)引入方式   1.引入js文件     在用的那一页,引入文件     Import tools from ‘./tools.js’     相应的js文件,必须暴露出来   2.引入组件     Import Hello from ‘./componen...

iOS开发核心动画之粒子效果

一. 示意图     绘画出一条线,点击开始有很多粒子绕着线运动,点击重绘消除粒子和线 二. 实现代码     设计思路:自定义一个View来描述控制器的View,在View加载过程中进行初始化,给View添加手势(UIPanGestureRecognizer),将自定义View转成复制层,创建一个粒子层,添加到复制层上,并保存粒子     监...

位域简介

位域简介 有些信息在存储时,并不需要占用一个完整的字节, 而只需占几个或一个二进制位。例如在存放一个开关量时,只有0和1 两种状态, 用一位二进位即可。为了节省存储空间,并使处理简便,C语言又提供了一种数据结构,称为“位域”或“位段”。所谓“位域”是把一个字节中的二进位划分为几个不同的区域, 并说明每个区域的位数。每个域有一个域名,可以在程序中按域名进行...

[转]thinkphp 模板显示display和assign的用法

thinkphp 模板显示display和assign的用法 $this->assign('name',$value); //在 Action 类里面使用 assign 方法对模板变量赋值,无论何种变量类型都统一使用 assign 赋值$this->display() // 输出模版文件批量赋值$array['name'] = 'thinkph...

Jmeter接口测试01

Jmeter 简介   Apache JMeter 是 Apache 组织的开放源代码项目,是一个纯 Java 桌面应用,用于压力测试和性能测试。它最初 被设计用于 Web 应用测试但后来扩展到其它测试领域。   Jmeter 功能   • 能够对 HTTP 和 FTP 服务器进行压力和性能测试, 也可以对任何数据库进行同样的测试(通过 JDBC)。  ...