关于OC中对象与指针的思考

1. 创建对象:

  OC中可通过代码Person *p = [[Person alloc] init];创建了一个对象p。该过程中内存情况为:

  在当前线程的栈(默认1M)中,存在一个(Person *)类型的变量p,因为C语言中前面带*的变量都是指针变量,故也可理解为栈中有一个Person数据类型的指针变量p(p是指针,p不光自己有地址,它4B大小的空间中存储着别的变量的地址)。

  同时在ios系统管理的堆中(所有app共享)通过alloc分配了一块能装下Person数据类型的存储空间(它有一个地址,假设为0x168168),通过init方法,将该存储空间中Person数据中的成员变量的值全部初始化为0。

  指针变量p是(Person *)类型,它4B的空间中存储着堆中[Person alloc]出来的那块内存空间的内存地址0x168168。 从此以后我们就会称指针变量p为一个对象,可以直接通过p来访问对象内存成员变量,调用对象内部的地址。

2. 总结:

    在OC中,从本质上看,对象是堆内存中按照某XXClass数据类型(类) alloc出来的一块有地址的内存空间,但这块内存空间必须要有栈中的某个指针(XXClass类型)指向它,否则它的引用计数为0,就会被系统自动回收。

    所以,在OC中,从表面上看,对象就是存在于栈中的某XXClass类型的指针变量(如Person *p),但是要求该指针变量中必须保存着堆内存中的一块有地址的内存(NSNull空对象也有地址),这样的指针变量才是对象。

举例:
Person *p = [[Person alloc] init]; //可以说p是对象
Person *m; // 不能说m是对象,它只是Person数据类型的一个指针变量
Person *n = p; //可以说n是对象,因为将p赋值给n,n和p都保存着堆中alloc出来的内存块(真正的对象)的地址0x168168,并且此时堆中的内存块的引用计数为2

3. 特殊的数据类型及其变量

在OC中常用的数据类型主要有: 基本数据类型(int/float/char/double等)、 系统框架类、 自定义类。

除了以上几种常用的,还有一些定义在<objc/objc.h>头文件中的本身就是指针的数据类型(如id类型、Class类型、Sel类型、Method类型、Ivar类型等),这些自身就是指针的数据结构,在用它们定义指针变量(OC表面上的对象)时,是不需要加*号的。

如 id boy = [[Person alloc] init];    Class personClass = [Person class]; //类方法来创建类对象

//以下均定义在 <objc/objc.h>头文件中

/// An opaque type that represents an Objective-C class.
typedef struct objc_class *Class; //带*号的Class是指针类型 /// A pointer to an instance of a class.
typedef struct objc_object *id; //带*号的id是指针类型 /// An opaque type that represents a method selector.
typedef struct objc_selector *SEL; //带*号的id是指针类型 /// An opaque type that represents a method in a class definition.
typedef struct objc_method *Method; //带*号的id是指针类型 /// An opaque type that represents an instance variable.
typedef struct objc_ivar *Ivar; //带*号的id是指针类型 /// An opaque type that represents a category.
typedef struct objc_category *Category; //带*号的id是指针类型 /// An opaque type that represents an Objective-C declared property.
typedef struct objc_property *objc_property_t; //带*号的id是指针类型

//创建类对象

Class personClass = [Person class];

NSLog(@"类对象:%@--%p",personClass,personClass);

//类对象:Person--0x100ea03a8

//id类型

id boy = [[Man alloc]init];

  NSLog(@"id类型:%@--%p",boy,boy);

//id类型:<Man: 0x7f8c89f230b0>--0x7f8c89f230b0

4. 综上:OC中所有的对象表面上看都是存储着堆中内存块地址的 (xxx类 *)p 或者 (指针类型)p 的指针。而真正的对象是堆内存中的【xxx类 alloc】出来的内存块。 

文章原创,转载请注明出处:http://www.cnblogs.com/stevenwuzheng/p/5501266.html

如有错误,欢迎随时指正!

[BS-21] 关于OC中对象与指针的思考的更多相关文章

  1. OC中对象拷贝概念

    OC中的对象拷贝概念,这个对于面向对象语言中都会有这种的问题,只是不同的语言有不同的解决方式:C++中有拷贝构造函数,Java中需要实现Cloneable接口,在clone方法中进行操作.但是不过OC ...

  2. OC中的野指针(僵尸指针)

    涉及到内存管理问题的都是类类型的变量,而在OC中我们操纵这些对象都是通过操纵指向他们的指针来完成的,一致很多时候会忽略指针存在.比如定义UIView * view = [[UIView alloc]i ...

  3. OC中对象元素的引用计数 自动释放池的相关概念

    OC中数组对象在是如何处理对象元素的引用计数问题的,同时介绍一下自动释放池的相关概念 一.数组对象是如何处理对象元素的引用计数问题[objc]  view plaincopy 1. //   2. / ...

  4. OC中的野指针,空指针,nil,Nil,NULL,NSNULL小结

    周末与一个老朋友吃饭聊天,因为他正在培训班学习iOS开发,就随便聊了几句,发现自己OC基础上的欠缺和一些知识点的混淆.特此整理如下. 1.空指针 没有存储任何内存地址的指针就称为空指针(NULL指针) ...

  5. OC中的self指针

    在OC中,self是一个指针,方法和属性可以通过self.function进行访问:成员变量使用self->变量名进行访问.调用方法还可以用[self function]; OC中的self有点 ...

  6. 编译时和运行时、OC中对象的动态编译机制

    编译时 编译时顾名思义就是正在编译的时候.那啥叫编译呢?就是编译器帮你把源代码翻译成机器能识别的代码.(当然只是一般意义上这么说,实际上可能只是翻译成某个中间状态的语言.比如Java只有JVM识别的字 ...

  7. oc中对象的初始化

    在.m文件中使用对象方法: - (id)init { _name =@"zhangsan"; _age = 18; return self; } 然后通过main方法中进行创建对象 ...

  8. OC中对象的description方法

    周所周知,我们在做项目时, 可以在类的.m文件中重写该类的对象的描述description方法: 示例: -(NSString *)description{    NSString *str = [N ...

  9. OC中nil、Nil、NULL、NSNull的区别

    nil:指向OC中对象的空指针 e.g.: NSString *string = nil; Nil:指向OC中类的空指针    e.g.:Class class = Nil; NULL:指向其他类型的 ...

随机推荐

  1. 《GK101任意波发生器》升级固件发布(版本:1.0.2build851)

    一.固件说明: 硬件版本:0,logic.3 固件版本:1.0.2.build851 编译日期:2015-06-26 ====================================== 二. ...

  2. HDU 1114 完全背包+判断能否装满

    题意 给出一个存钱罐里的钱币重量 给出可能的n种钱币重量以及价值 求存钱罐中钱币的最小价值 若不可能另有输出 在裸的完全背包上加了一点东西 即判断这个背包能否被装满 初始化 dp[0]=0 其余的都使 ...

  3. Nginx 笔记与总结(6)Location:精准匹配

    在 /usr/local/nginx/conf/nginx.conf 的 server 段中,location 表示根据 URI 来进行不同的定位:把网站的不同部分定位到不同的处理方式上,例如遇到 . ...

  4. 只要项目是maven构建的,pom.xml中依赖的jar包全都默认去你电脑本地仓库去找

    只要项目是maven构建的,pom.xml中依赖的jar包全都默认去你电脑本地仓库去找

  5. Windows注册表(持续更新)

    HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Zoom 下, 设置DWORD 值 ZoomDisabled  等于 1.

  6. SQL优化(zhuan)

    转自:http://www.jfox.info/SQL-you-hua 数据库的优化问题 一.问题的提出 在应用系统开发初期,由于开发数据库数据比较少,对于查询SQL语句,复杂视图的的编写等体会不出S ...

  7. 【转】配置 VS 2015 开发跨平台手机应用

    为了使用 VS 2015 开发跨平台手机应用,VS 2015 装了很多次,遇到了很多坑,才终于弄明白怎样配置才能正常使用C#开发手机应用,现把步骤分享给大家,以免大家少走弯路. 运行环境: Windo ...

  8. 【转】用树莓派搭建web服务器

    本文将详细介绍如何在树莓派上配置服务器,和<教你在Xubuntu上搭建LAMP服务器>有些类似,多了一些介绍在树莓派上的不同步骤的地方. 这种服务器的配置被称为LAMP,是最流行的服务器配 ...

  9. 【Android测试】【第十四节】Appium——简述

    ◆版权声明:本文出自胖喵~的博客,转载必须注明出处. 转载请注明出处:http://www.cnblogs.com/by-dream/p/5124340.html 前言 同样的,这一篇我要介绍的也是一 ...

  10. C#中扩展方法

    什么是扩展方法? 扩展方法顾名思义,就是允许向现有的“类型”添加方法,而无需创建派生类.重新编译或以其他方式修改原来类型. 扩展方法是一种特殊的静态方法,但可以像扩展类型上的实例方法一样进行调用. 扩 ...