__strong 修饰符内存分析及循环引用带来的内存泄露

第一、__strong 修饰符简介
__strong 是id类型和所有对象类型默认的所有权修饰符

__strong 表示对对象的强引用,在ARC中持有强引用变量在超出其作用域或强引用失效(如被置为nil),则引用对象被自动释放

第二、实例内存分析

      id __strong obj1=[[NSObject allocinit]; /* create object A */

        /*

         * obj1持有对对象A的强引用

         */

        id __strong obj2=[[NSObject allocinit]; /* create object B*/

        /*

         * obj2持有对对象B的强引用

         */

        id __strong obj3=nil;

        /*

         *obj3不持有任何对象

         */

        obj1=obj2;

        /*

         * obj1持有对对象B

         * 对象A没有持有者,因此A释放

         */

        obj3=obj1;

        /*

         * obj1,ojb2,obj3共同持有对象B

         */

        obj1=nil;

        /*

         * ojb2,obj3共同持有对象B

         */

        obj2=nil;

        /*

         * obj3共同持有对象B

         */

        obj3=nil;

        /*

         * 对象B没有持有者,故释放

         */

第三、总结:

        自己生成的对象,自己持有

         非自己生成的对象,自己也能持有

         不再需要自己持有的对象时释放

第四、__strong循环引用带来的内存泄露

         

@interface Test : NSObject
{
    id __strong _obj;
}
-(void)setObject:(id __strong)obj;

@end

#import "Test.h"

@implementation Test

-(id)init{
    self=[super init];
    if (self) {
    }
    return  self;
}
-(void)setObject:(id)obj
{
    _obj=obj;
}
-(void)dealloc{
    //[super dealloc];
    NSLog(@"Test");
}
@end

#import "Test.h"
int main(int argc, const char * argv[]) {
    @autoreleasepool {
        Test *obj1=[[Test alloc] init];
        /*
         * obj1 持有对象A
         */
        Test *obj2=[[Test alloc] init];
        /*
         * obj2 持有对象B
         */
       
        [obj1 setObject:obj2];
        /*
         * obj1,obj2 持有对象B
         */
        [obj2 setObject:obj1];
        /*
         * obj1,obj2 持有对象A
         */
        /*
         循环引用容易发生内存泄露
         */  
    }
      return 0;
}

解决方法使用weak,详情见下篇

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值