#import
#import "Person.h"
int main(int argc, const char * argv[]) {
Autorelease自动释放池
/*示例1
// release 功能:retainCount - 1
// autorelease 功能好像也是 retainCount - 1
//自动释放池
//对象存入自动释放池中,当这个池子被销毁的时候他会对池子内所有对象进行一次release操作
//大括号代表池子的作用域
@autoreleasepool {
//retainCount = 1
Person * p = [[Person alloc] init];//虽然表面在池子的大括号里面,但其实还没放入自动释放池中。
// [p release]; retainCount 立即-1
[p autorelease];//autorelease的作用只是将对象放入自动释放池中,并不会立即让retainCount-1。并返回一个self
NSLog(@"dfjjff");
}//代表池子将要被销毁,对其中所有对象进行一次release操作 [p release] retainCount -1。
*/
/*示例2
@autoreleasepool我们可以随意的创建
//1 不管你这个对象是在@autoreleasepool中创建的还是在之外创建的,只要在池中调用了这个对象的autorelease方法就会把这个对象放到池子中。
Person * p = [[Person alloc] init];
@autoreleasepool {
[p autorelease];
}// p 0
*/
/*示例3
结论:只有在自动释放池的作用域中调用对象的autorelease方法,才能正确将对象放入自动自动释放池中。
Person * p = [[Person alloc] init];
[p autorelease];
NSLog(@"aaaa");
@autoreleasepool{
}
NSLog(@"bbbb");
*/
/*示例4
Person * p = [[Person alloc] init];
@autoreleasepool{
[p autorelease];
[p autorelease];
}[p release] 0 [p release]野指针 在自动释放池中调用了几次autorelease就会在释放时调用几次release所以造成野指针。
*/
/*示例5
Person * p = [[Person alloc] init];
@autoreleasepool{
@autoreleasepool{
//1
[p autorelease];
}//0 p可以被正确销毁,在哪个池中中就随着那个池子销毁。
}
*/
/*示例6
Person * p = [[Person alloc] init];
@autoreleasepool{
[p autorelease];
@autoreleasepoo{
//1
[p autorelease];
}//[p release] 0 被销毁
}//[p release] 野指针
*/
return 0;
}
ARC机制
//ARC简单,不用程序员在去管理内存
//1.强指针 Strong
//2.弱指针 weak
//只要有强指针指向一个对象,那么系统就不会回收该对象
//只要没有强指针指向对象,系统立即回收该对象
//弱指针不影响,对象被回收
//默认情况下,所有的指针都是强指针类型
#import
#import "Person.h"
void text(Person * v)
{
v = nil;
}
int main(int argc, const char * argv[]) {
/*@autoreleasepool {
Person * p = [[Person alloc] init];//默认就是强指针。
}//由于在自动释放池的作用域内所以P被释放了
*/
/*
Person * p = [[Person alloc] init];
// p = nil;//P不再指向这个对象,这个对象没有强指针指向了就会被释放。
Person * p1 = p;//这是两个强指针指向这个对象
p = nil;//P的强指针不再指向这个对象,但是P1的强指针在指向这个对象,只要有一个强指针指向这个对象就不会被释放掉
*/
/*
Person * p = [[Person alloc] init];
text(p);//P只在在这个方法中变成nil对外面的p没影响
p = nil;//P被释放了,不再用强指针指向对象。
*/
/*
//刚一创建出来就被销毁了,因为没有强指针指向该对象
__weak Person * p = [[Person alloc] init];//前面加上__weak这个对象就变成了弱指针
*/
/*
Person * p = [[Person alloc] init];//默认强指针
__weak Person * p1 = p;//P1是弱指针不影响对象被回收
p = nil;//唯一一个强指针变成了nil 对象被回收了。
*/
return 0;
}