智能指针 与 oc中的指针

智能指针 与 oc中的指针

智能指针的原理及实现

当类中有指针成员时,一般有两种方式来管理指针成员:一是采用值型的方式管理,每个类对象都保留一份指针指向的对象的拷贝;另一种更优雅的方式是使用智能指针,从而实现指针指向的对象的共享。

智能指针(smart pointer)的一种通用实现技术是使用引用计数(reference count)。智能指针类将一个计数器与类指向的对象相关联,引用计数跟踪该类有多少个对象共享同一指针。

每次创建类的新对象时,初始化指针并将引用计数置为1;当对象作为另一对象的副本而创建时,拷贝构造函数拷贝指针并增加与之相应的引用计数;对一个对象进行赋值时,赋值操作符减少左操作数所指对象的引用计数(如果引用计数为减至0,则删除对象),并增加右操作数所指对象的引用计数;调用析构函数时,析构函数减少引用计数(如果引用计数减至0,则删除基础对象)。

智能指针:

当类中有指针成员,创建几个对象,
当有几个对象 共同用一个资源时,则它们同时指向了这个资源,如果用普通的指针,则在其中一个对象析构时就会将这个共用的资源销毁,有了智能指针就不用担心,它里面有对象计数,代表有几个对象在用它,销毁一个就减1,直到为0,为0时就表示没有对象用这个资源了,就会自动释放资源存储区!还有很多智能的地方

@interface Quotation:NSObject

{

NSString *id;

NSString *name;

NSString *price;

Account *account;

}

在oc的对象中,成员都是指针,对于id,name,price属性,类对象维护各自那份内存,但是对于account属性,很多情况下,很多quotation对象会共享一份account,这种情况下就需要使用智能指针了。

比如

{

Quotation *quotation1 =[ [Quotation alloc] init];

quotation1.name = @"gold";

quotation1.price = @"12.7";

Quotation *quotation2 =[ [Quotation alloc] init];

quotation2.name = @"dollor";

quotation2.price = @"12.2";

}

quotation1与quotation2的price指针并不共享一块内存,各自维护自己的内存。

如果是下面的情况,使用智能指针就比较好:

{

Account *currAccount = self.account;

Quotation *quotation1 =[ [Quotation alloc] init];

quotation1.account = account;

Quotation *quotation2 =[ [Quotation alloc] init];

quotation2.account = currAccount;

[currAccount release];

//上面的情况,如果quotation类的account属性不是retain的,而是普通的assign赋值:

quotation1,quotation2的account指向了同一块内存,如果quotation1把account内存释放了,那么quotation2的account就是个野指针了,因为account指向的内存已经被quotation1释放了。这种情况下,quotation2使用account就crash了。这种情况下就需要用智能指针来防止。

当果quotation类的account属性是retain的:

[currAccount release];//虽然currAccount被release了,但是currAccount被quotation1对象保留了一次,所以currAccount并没有被释放,当quotation1对象释放currAccount的时候,他也不一定被释放,因为quotation2又保留了它,所以只有当currAccount的引用计数器为0的时候他才会被释放,在oc中,通过设置retain属性就是智能指针的应用。quotation1与quotation2对象共享了一块内存currAccount。通过引用计数器解决共享内存释放的问题。

}

由此可见,oc中的指针只要是retain属性就默是智能指针,通过引用计数器来实现指针指向的对象的共享。最终控制指针指向的内存的释放。

在oc中基本上所有的对象都是retain(或者strong)属性,除了delegate对象(为了防止循环引用)。

在oc中,对象如果不用retain智能指针,而是使用普通的指针,那么就会出现某个对象释放了共享内存,另一个对象再使用这块内存的时候crash的问题。

oc的内存管理使用引用计数器,也就是使用智能指针管理。智能指针的作用就是来管理共享内存的释放,只有当retainCount为0才能释放共享内存。

时间: 2024-10-08 14:15:51

智能指针 与 oc中的指针的相关文章

OC中的指针

NSError *err = nil; NSError __strong **error = &err; //因为在oc中,通过* *err 创建的指针是用__strong修改的,所以要一致,NSError __strong(需要在前面加上) **error NSError __autoreleasing *errO = nil; NSError __autoreleasing * *errorO = &errO; //因为在oc中,通过 *err 创建的指针是用__autoreleasi

oc中的指针(一)

谈到c语言,不得不提指针,有多少英雄好汉栽在指真上.利用指计可以很方便的使用数组和字符串(C#中的String类型就是引用类型,也就是指针类型).指针支持动态分配内存,可以让程序更简介,提高效率. "要想精确打击,就要人工引导"---军旅剧中导弹兵经常会这样说,指针类似于人工引导的坐标.灵活,易用,同时也很复杂,引导错误就是毁灭性的打击.举个栗子:移动大厦一层有10个方间,编号依次是1-10.其中2号给A公司租用,5-8给公司租用.以每个房间的编号第一个为公司的地址.如果我们要给A公司

51CTO C开发频道中笔记之二(C/C++中的指针的应用及注意问题)

(1)指针是存放地址值的变量或者常量. 例如:int a=1;&a就表示指针常量("&"表示取地址运算符,也即引用). int *b,b表示的是指针变量(注意,是b表示指针变量而不是*b),*表示要说明的是指针变量.大家注意int *b[2]和int(*b)[2]是不同的,int *b[2]表示一个指针数组,而int(*b)[2]表示含有两个元素的int指针. (2)指针类型:可以把指针名字去掉,剩下的就是这个指针 例如:int *a;//指针类型为int * int

指针的本质---如何确定指针的类型

前言:复杂类型说明 要了解指针,多多少少会出现一些比较复杂的类型,所以我先介绍 一下如何完全理解一个复杂类型,要理解复杂类型其实很简单,一 个类型里会出现很多运算符,他们也像普通的表达式一样,有优先 级,其优先级和运算优先级一样,所以我总结了一下其原则: 从变量名处起,根据运算符优先级结合,一步一步分析. 下面让我们先从简单的类型开始慢慢分析吧: int p; int *p; //这是一个普通的整型变量 //首先从 P 处开始,先与*结合,所以说明 P 是一 //个指针,然后再与 int 结合,

c语言中,指针加1的情况.指针变量详细介绍

指针是一个特殊的变量,它里面存储的数值被解释成为内存里的一个地址. 要搞清一个指针需要搞清指针的四方面的内容: 指针的类型, 指针所指向的 类型, 指针的值或者叫指针所指向的内存区, 还有指针本身所占据的内存区. 让我们分别说明. 先声明几个指针放着做例子:  例一:  (1)int *ptr;  (2)char *ptr;  (3)int **ptr;  (4)int(*ptr)[3];  (5)int*(*ptr)[4]; 指针的类型  从语法的角度看,你只要把指针声明语句里的指针名字去掉,

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

涉及到内存管理问题的都是类类型的变量,而在OC中我们操纵这些对象都是通过操纵指向他们的指针来完成的,一致很多时候会忽略指针存在.比如定义UIView * view = [[UIView alloc]init];然后我们会使用view这个指针来做许多的操作.而由指针带来的一个性质是,当view == nil的时候,是指view这个指针没有指向任何地方,不能代表view指向地方的值是空的.同样当view不为nil的时候,值说明它指向了一个地方,而不能说明它指向的地方有值.僵尸指针就是这样情况,比如:

Objective-C Objective-C中的指针,及对象的直接指向,copy和mutablecopy

1.Objective-C的指针世界 OC一直是人感觉比较变态的一门语言,为什么呢?因为它的每个变量都是指针型,多的都几乎让人忘了那个*的存在了. 所以常常a=b这个等号让我产生错觉,总以为a从b那拷贝了一份. 然而这的的确确,却是个指针.a这个变量存的内容是b所在的地址. 比如我定义了一个Student的Class,new了stu1和stu2,并把stu2=stu1,那当两者任何一个进行修改时,两个变量的内容都会修改. Student *stu1=[[Student alloc]init];

swift学习笔记-----swift中的指针

swift语言为了简化,把指针隐形化了.没有像OC中那样的" * ".把底层的问题交给C语言去处理,我们可以在swift中调用C 语言来解决.当然,OC也是可以调用的. 但是在某些场景下,这种调用可能不是很方便.比如,基于字节流的解析中,这时我们所接受的数据是要进行解析,可能用到指针.如果在C中去调用,当然也是可以的.但如果想写的简洁一些,用swift直接去处理这些,是否可以呢.那就要看在swift中是否很好的去使用指针呢. 事实上,swift是支持使用指针的.苹果已经公开了swift

file结构体中private_data指针的疑惑【转】

本文转载自:http://www.cnblogs.com/pengdonglin137/p/3328984.html hi all and barry, 最近在学习字符设备驱动,不太明白private_data在字符驱动中的作用,我们在 驱动中添加一个设备结构体,然后定义了这个结构体的全局指针变量,接着我们就能在 驱动程序中使用这个指针了.我看到很多驱动程序中都把结构体指针付给private_data, 然后对private_data操作. 为什么要使用private_data,难道仅仅是避免使