oc __weak和__strong的区别

1.先上代码

 id __weak obj=[[NSObject alloc]init];
    NSLog(@"弱引用自身地址:%p",&obj);
    NSLog(@"弱引用指向地址:%p",obj);

    id __strong obj0=[[NSObject alloc]init];
    id __weak obj1=obj0;
    NSLog(@"强引用自身地址:%p",&obj0);
    NSLog(@"弱引用自身地址:%p",&obj1);
    NSLog(@"强引用指向地址:%p",obj0);
    NSLog(@"弱引用指向地址:%p",obj1);

    obj1=nil;
//    obj0=nil;
    NSLog(@"弱引用销毁时强类型变量指向地址:%p",obj0);
    NSLog(@"弱引用销毁时弱类型变量指向地址:%p",obj1);

2.运行结果

3.当强类型变量设为nil时,两个变量都指向空

4.由此可见,强引用时对变量拥有,弱引用时只是指向该变量而不拥有。

时间: 2024-11-14 07:09:30

oc __weak和__strong的区别的相关文章

__weak、__strong这样的关键词和weak、strong有哪些区别

ios4 设备上最好就不要使用 ARC... strong,weak 用来修饰属性.strong 用来修饰强引用的属性:@property (strong) SomeClass * aObject; 对应原来的 @property (retain) SomeClass * aObject; 和 @property (copy) SomeClass * aObject; weak 用来修饰弱引用的属性:@property (weak) SomeClass * aObject; 对应原来的 @pro

__weak 和 __strong 还有Autorelease的用法

使用容器的block版本的枚举器时,内部会自动添加一个AutoreleasePool: Autorelease对象是在当前的runloop迭代结束时释放的,而它能够释放的原因是系统在每个runloop迭代中都加入了自动释放池Push和Pop 当然,在普通for循环和for in循环中没有,所以,还是新版的block版本枚举器更加方便.for循环中遍历产生大量autorelease变量时,就需要手加局部AutoreleasePool咯. [array enumerateObjectsUsingBl

关于__weak 和 __strong配和使用的原因

之前,看到关于blcok外使用__weak弱化对象,blcok内再用 __strong 强引用的原因: 保证对象在blcok中不会被提前释放,当blcok执行完之后,自动释放该对象. 今天看了一下__weak修饰的对象,在被使用的时候,每次使用都会被注册到autoreleasepool中,例如: { id __weak o = obj; NSLog(@"%@",obj); NSLog(@"%@",obj); NSLog(@"%@",obj); N

ios的__weak、__strong关键字

这个是针对arc来说的 __weak是弱引用 __strong是强引用 官方的说明如下 __strong is the default. An object remains “alive” as long as there is a strong pointer to it. 强引用是默认的,对象像强指针一样持久的存在 __weak specifies a reference that does not keep the referenced object alive. A weak refer

block 中使用__weak 和__strong修饰符的问题

在ARC环境下,我们常常会使用weak 的修饰符来修饰一个变量,防止其在block中被循环引用,但是有些特殊情况下,我们在block中又使用strong 来修饰这个在block外刚刚用__weak修饰的变量,为什么会有这样奇怪的写法呢? 后来上网查资料,给的解释就是下面的这段话: 在block中调用self会引起循环引用,但是在block中需要对weakSelf进行 strong,保证代码在执行到block中,self不会被释放,当block执行完后, 会自动释放该strongSelf: 对于程

iOS开发-多层嵌套block中如何使用__weak和__strong

1.关于__weak__weak只能在ARC模式下使用,也只能修饰对象(比如NSString等),不能修饰基本数据类型(比如int等)__weak修饰的对象在block中不可以被重新赋值.__weak只在ARC下使用,可以避免循环引用.__weak修饰对象不会增加引用 __weak __typeof(self) weakSelf = self; self.testBlock = ^{ [weakSelf doSomeThing]; }); 弱引用不会影响对象的释放,但是当对象被释放时,所有指向它

我是黑马-----OC与C语言的区别

C语言是面向过程的编程语言,而OC则是面向对象的编程语言. 面向对象:打个比方,就是你做一次菜,让老婆做个菜,吃饭,这就是面向对象,效率高 面向过程,就是每一个细节:比如你要先把或开到合适的位置.然后还要洗菜 ,等油热了,才能开始炒菜,然后调料,...,起锅,到碗里,吃饭.... 面向对象编程的代码更容易维护.它把具体的操作细节封装在类里,用的时候创建个对象,一顿调用方法,搞定!(当然类的实现方法还是需要自己写,面向对象只是一种编程思想.) OC继承.或者说是拓展于C语言,OC里可以直接写C语言

OC -- BOOL与bool的区别

下面的情况,BOOL与bool可以通用 BOOL(bool)  b1 = YES;   // 输出1 BOOL(bool) b2 = 1;    // 输出1 BOOL(bool) b3 = NO;   // 输出0 BOOL(bool) b4 = 0;    // 输出0 BOOL与bool的区别如下: BOOL b5 = 2;   // 输出2 BOOL b6 = -2: // 输出-2 bool b7 = 2;   // 输出1 bool b8 = -2;    // 输出1

java中的继承与oc中的继承的区别

为什么要使用继承? 继承的好处: (1)抽取出了重复的代码,使代码更加灵活 (2)建立了类和类之间的联系 继承的缺点: 耦合性太强 在OC中的继承是: 1.OC中不允许子类和父类拥有相同名称的成员变量名:(java中是可以的) 2.编译器从上往下执行,所以在子类前面至少应该要有父类的声明:如 @interface Worker : Person @end 3.OC中的子类可以拥有和父类相同名称的方法,在子类调用时,优先去自己的内部寻找,如果父类没有定义该方法,则继续在继承链上查找,直到找到为止,