对于oc中得内存管理

对于出现的问题:

(1)retain is unavailable not available is automatic reference counting mode,这个东西出现的主要原因是在xcode4.2后,有xcode进行自动的引用计数统计,如果你还是使用retain这样的东西。比如说:Node *pNode = pMode;

[pNode retain]这样的形式,这样就造成了有retain,如果你不想利用xcode 的自动引用计数统计,那么你只要在xcode中得objective - C automatic reference counting中设置为false就可以了。

好了,现在我们就必须自己来管理自己的内存了。

现在讲一下没什么要再我们的main函数中第一个就是用:

NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

这样的东西,然后再main的最后面添加这样的东西[pool release];

这个东西的作用就是,自动进行内存进行回收,其实这个也顶多是个半自动的半自动内存回收,其实在oc中,其实他得本质是,在oc中形成一个数组来对每个引用的对象建立一个索引,当文件执行到最后的时候,只不过是讲这个数组中得每个对象进行一个计算器-1,只有那些真正的计数为1的才被销毁的,其他的数据还是没有被消除,这个东西好像也没什么用。

这个东西是可以内嵌的。

在一个定义的申明中一定要出现alloc,或者copy或者retain,这时候他的计数器才会增加1,也就是说:Node *pNode = [[Node alloc] init];这时候的计算为1,如果是这样的Node *pMode = pNode ;这时候计数是不会增加的。所以如果我们再对函数进行参数传递的时候,我们最好是使用retain将这个对象引用计算+1再说,然后再函数的末尾进行一个release就可以。这样可以防止该对象在函数调用的外面将对象释放了,这样就会出现野指针,是很危险的。还有一点为什么我要说一定要出现alloc才能使得计数器+1呢?因为有这样的情况:NSString *pStr = @"221321"这个东西的计数器是为不为1的,这个东西不需要你进行管理,系统会帮你管理的,但是如果你是这样的那么你就必须讲内存进行释放了哦:

NSString *pNode = [NSString alloc] initWithFile:@"fdsaf.png“]这样形式的话,因为中间有alloc那么我们必须进行内存的释放;

有时候我们可能看到这样的情况:

Node *pNode = [[Node alloc] init] autoRelease]这个东西的意思也就是这个对象是进行自动释放的,也就是引用计数为1的时候到函数的结尾时会自动回收的。

还有一个要注意的就是:

如果这个对象的引用计数不为0的时候,就算你使用dealloc也不能销毁改对象,一定要先讲retain得值设置为0以后才能真正释放内存。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值