标签:objective-c ios ios开发 内存管理
内存管理:
对象的生命周期:
关于引用计数的操作:
-(id) retain //返回值为id类型
[[Car retain] setTire: tire atIndex:2];//car对象保留计数器的值+1并执行setTire的操作
(oneway void)release;
-(NSUInteger) retainCount;//格式化方法:%ld
main(){
Car *car = [Car new];
Engine *engine = [Engine new];//engine拥有engine对象
[car setEngine: engine];//car拥有engine对象
}
注意:main()和Car类都拥有engine对象,如何释放?
-(void)setEngine: (Engine *)newEngine
{
[newEngine retain]; //先保留新的对象
[engine release]; //释放旧的对象
engine = newEngine;
-(NSString *) description
{
NSString *description = [[NSString alloc] initWithFormat:@"I am %d years old", 4];
return (destription);
}
main{
NSString *desc = [someObject description];
NSLog(@"@",desc);
[desc release];
}
注意:在description方法中创建的字符串对象如何释放?
-(id)autorelease;//返回接受这条消息的对象
-(NSString *) description
{
NSString *description = [[NSString alloc] initWithFormat:@"I am %d years old", 4];
return ([destription autorelease]);//对象暂时放入池中,等调用NSLog代码结束后,自动释放池会被自动销毁
}
main(){
NSLog(@"@",[someObject description]);
}
int main ()
{
NSAutoreleasePool *pool;
pool = [[NSAutoreleasePool alloc] init];
RetainTracker *tracker;
tracker = [RetainTracker new]; // count: 1
[tracker retain]; // count: 2
[tracker autorelease]; // count: still 2,自动释放池有一个引用指向了该对象,当自动释放池被销毁时,将给tracker对象发送一条release消息。保留计数器的值仍然大于0,仍处于活动状态。
[tracker release]; // count: 1
NSLog (@"releasing pool");
[pool release]; //dealloc方法调用
return (0);
}
注意:当拥有一个对象的时候,需要弄清楚:怎样获得对象的?打算拥有多长时间?
并未打算长期拥有对象的情况下:临时对象
在多段代码中一直拥有某个对象,将她们加入到诸如NSArray或NSDictionary集合中
-(void)dostuff
{
flonkArray = [NSMutableArray new]; //count:1
}
-(void) dealloc
{
[flonkArray release]; //count:0
[super dealloc];
}
-(void)dostuff
{
flonkArray = [NSMutableArray arrayWithCapacity:17]; //count:1,autoreleased
}
-(void) dealloc
{
[flonkArray release]; //count:0
[super dealloc];
}
注意:自动释放池被清理的时间是完全确定的:在代码中你自己手动销毁;使用AppKit时在事件循环结束时结束。
垃圾回收器定期检查变量和对象并且跟踪它们的指针,发现没有任何变量指向某个对象时,就将该对象视为应该丢弃的垃圾。
如果实例变量指向某个对象,一定要将该实例赋值为nil,取消对该对象的引用并告知垃圾回收器该对象可以清理了。
注意:
stringWith:
自动引用计数(automatic refrence counting,ARC):系统追踪对象并决定哪一个仍会使用,哪一个不会再用到。
ARC在编译时进行工作的,在代码中插入了retain和release语句。
有效范围:可保留的对象指针
使用ARC满足的条件:
A引用了B,B的引用计数器+1,强指针;被引用的+1
A释放了B,B的引用计数器-1;被释放的-1
归零弱引用:zeroing weak reference 若引用的对象被释放的情况下,若引用会被设置为0
声明归零弱引用:
_weak NSString *mystring
@property (weak) NSString *myString
注意:内存管理的关键字和特性是不能一起用的
垃圾回收机制禁用的前提下才能使用ARC
转换之前确保代码符合ARC的需求
一旦转换成ARC版本,就不可以再恢复了
拥有者权限:为了让ARC便于工作,需要告诉编译器哪个对象时指针的拥有者。
cfstring = (_bridge CFStringRef)theString;
//指针的所有权仍然由theString保留
(_bridge_retain):所有权转移到non-ROP上
cfstring = (_bridge_retain CFStringRef)theString;
//cfstring拥有指针并且保留计数器+1
(_bridge_transfer):所有权交给ROP
ARC拥有对象并能确保它会像其他ARC对象一样得到释放
NSException类来表示异常
如果一个异常被抛出但是没有被捕捉到,程序会在异常断点处停止运动并通知有这个异常。
NSException *theException = [NSException exceptionWithName: ];
@throw theException; //抛出异常,可以用在其他对象上
[theException rasie];//抛出异常,raise只对NSException对象有效
版权声明:本文为博主原创文章,未经博主允许不得转载。
[学习笔记—Objective-C]《Objective-C-基础教程 第2版》第九章 内存管理
标签:objective-c ios ios开发 内存管理
原文地址:http://blog.csdn.net/apple890111/article/details/47098449