[OC基础]ARC机制

#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;

}



你可能感兴趣的:(IOS开发OC基础知识点纪录)