objective-c 中weak和strong使用的区别

作者&投稿:主变 (若有异议请与网页底部的电邮联系)
ios中strong和weak的区别~

首先strong和weak这两个关键字是用来修饰变量,表示这个变量是强(strong)引用和弱(weak)引用

我们在程序中经常会用到“[[class alloc]init]” 这样的代码,我想你对它已经很熟。这是在开辟一块内存,并初始化。那么系统开辟了这块内存,我们怎么去拿到它呢?
显然是将刚分配好的内存赋值到一个变量,以后我们就可以利用这个变量直接操作这块内存了。那么把刚分配的内存赋值给一个strong变量和weak变量是有区别的:
赋值给weak变量后这块内存会马上被释放。而分配给strong变量的会等到这个变量的生命周期结束后,这块内存才被释放(不用关键字weak修饰的变量默认为strong变量)。

看下面的例子:
添加一个Person类,只有一个name属性

[objc] view plain copy
@interface Person : NSObject
@property(nonatomic,copy) NSString *name;
@end

main函数中定义了一个weak的zhangSan和一个strong的李四,很明显zhangSan指定的内存在“zhangSan=[[Person alloc]init]”执行后就立即被释放了。我们分别打印出两个变量的地址和name属性,可以看到zhangSan的确被释放了,而liSi一直到程序的结尾。

[objc] view plain copy
int main(int argc, const charchar * argv[]) {
@autoreleasepool {

__weak Person* zhangSan=[[Person alloc]init];
zhangSan.name=@"张三";

Person *liSi=[[Person alloc]init];
liSi.name=@"李四";

NSLog(@"%p----%p",zhangSan,liSi);
NSLog(@"%@----%@",zhangSan.name,liSi.name);
}
return 0;
}

我们可以这样理解,分配出来的内存像一头牛,得用一条结实、强壮(strong)的绳子才能把它牵住,用纤细、弱小(weak)的绳子的话,这头牛随时会把绳子挣断逃脱。
而绳子的另一端是被固定到我们能够看得见够得着的物体(就是我们的变量)上面,我们顺着这个物体上面的绳子摸索过去,你的那头牛还在不在就看你用的上面绳子了。
那既然weak类型的变量内存分配出来就被释放了,它还有什么用呢?我们再看下面的例子

先将分配好的内存赋值给一个strong变量,然后再将这个strong变量赋值给一个weak变量,这样两个Person的地址都一样,显然name属性也一样。这样就好比先用结实的绳子拴住牛,这样牛就不会跑了,然后在用一根弱小的绳子拴住这头牛,这样顺着这根弱小的绳子也能找到这头牛。很明显如果当我们把结实的绳子弄断时,弱小的绳子自然也拉不住这头牛了。比如下面的例子:

“liSi”声明在一对大括号内,表明它只在大括号内有效,除了大括号,这个拴绳子的物体就不在了,那么牛自然挣脱弱小绳子的束缚跑掉,所以你再拿到“wangWu”想找到那头牛(内存及内存中的值)就不可能了。那如果有多条结实的绳子拴住牛,想必你也知道是怎么回事了。

用两条结实的绳子拴住一头牛,即使一根不在了,利用另一根还是能找到这头牛。

说到这里其实也没有说到weak类型的变量这种机制到底有什么用,我们看下面的例子
1.自定义一个VIew继承自UIView,重写dealloc方法,查看对象什么时候被销毁

[objc] view plain copy
#import "myView.h"

@implementation myView

-(void)dealloc
{
NSLog(@"对象被销毁");
}

@end

2.我们在程序要主视图的时候,将自定义视图添加到主视图上,并且添加按钮,监听点击事件。

[objc] view plain copy
- (void)viewDidLoad {
[super viewDidLoad];

//创建自定义view
myView *view=[[myView alloc]init];
view.frame=CGRectMake(50, 50, 200, 200);
view.backgroundColor=[UIColor redColor];
UILabel *msgLabel=[[UILabel alloc]initWithFrame:CGRectMake(0, 0, 200, 20)];
msgLabel.text=@"这是一个视图";
[view addSubview:msgLabel];

//添加到视图
[self.view addSubview:view];

//添加按钮
UIButton *btn=[[UIButton alloc]initWithFrame:CGRectMake(100, 260, 100, 80)];
[btn setTitle:@"移除子视图" forState:UIControlStateNormal];
[btn setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
[btn addTarget:self action:@selector(btnClick) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:btn];
}
-(void)btnClick
{
NSLog(@"点击了按钮");
}

我想要的效果是:点击按钮移除 子视图 ,并且程序以后的运行永远也不会用到这个view。
这里我想到有两种方式拿到这个view,然后从父控件中移除它,
第一种:这种方式显然能实现这样的要求,我们能看到打印结果,在子视图被移除父控制器之后对象也被销毁了。然而这不是我们最常用的方式,有可能父控件上有很多子视图,这样效率很低,而且代码不简洁。

[objc] view plain copy
-(void)btnClick
{

for (UIView *subView in self.view.subviews) {
if ([subView isKindOfClass:[myView class]]) {
[subView removeFromSuperview];
}
}
NSLog(@"点击了按钮");
}

第二种:我们给控制器增加一个属性,指向我们的子视图。这个属性有两种可能,一种是strong,一种是weak。我们先来试试strong。
从结果可以看出,点击按钮子视图是移除了,但是对象没有被销毁。它仍然在内存中(你可以再添加一个按钮打印一下self.testView试试),这不是我们想要的效果。

我们在来试试weak,只需要将声明变量的地方的strong改为weak即可,其他地方不变。从运行结果可以看出:子视图被移除了,且变量被销毁了。

为什么我们没有添加strong属性的时候分配出来的内存没有被释放,仍然能通过for循环找到它?需要注意的是:当一个视图A被添加到另一个视图B时,A就被B的subViews强引用了(有一个结实的绳子拉着它了),所以我们再用一个强属性去拉着它的话,自然要两条绳子都断了,它才会被释放。
也许现在你对strong和weak又对一点了解了

weak引用是为解决相互引用形成的死锁或死锁链,
类似操作系统解决死锁一样。
strong引用是一般意义上的,
这个概念是从c++的面向对象引入的,
在c++的boost中也有相关的弱引用和强引用的指针

  (weak和strong)不同的是 当一个对象不再有strong类型的指针指向它的时候 它会被释放 ,即使还有weak型指针指向它。
  一旦最后一个strong型指针离去 ,这个对象将被释放,所有剩余的weak型指针都将被清除。
  可能有个例子形容是妥当的。
  想象我们的对象是一条狗,狗想要跑掉(被释放)。
  strong型指针就像是栓住的狗。只要你用牵绳挂住狗,狗就不会跑掉。如果有5个人牵着一条狗(5个strong型指针指向1个对象),除非5个牵绳都脱落 ,否着狗是不会跑掉的。
  weak型指针就像是一个小孩指着狗喊到:“看!一只狗在那” 只要狗一直被栓着,小孩就能看到狗,(weak指针)会一直指向它。只要狗的牵绳脱落,狗就会跑掉,不管有多少小孩在看着它。
  只要最后一个strong型指针不再指向对象,那么对象就会被释放,同时所有的weak型指针都将会被清除。

weak是弱引用,相当于assign,不会造成循环引用!strong是强引用,相当于retain.


object和objective有什么区别,怎么用?
二、objective的详细释义 n. 目标;目的;【光学】(望远镜、显微镜、照相机及其他光学仪器上的)物镜;【语法】宾语;宾格;宾格词 adj.客观的;就事论事的;【哲】客观存在的;某于事实的;【语法】宾格词形变化 三、知识点拓展:其他表示目标的单词:1、aim从本义“靶子”引申而来,侧重比较具体而明确的目标...

单词objective和object的区别是什么?
objective和object的区别如下:一,音标和词性不同:object\/bdkt; bdekt\/ ;词根,可以作名词或者动词。2. objective \/əbˈdʒektɪv\/;名词和形容词;可以是object对应的形容词。其它词形:复数 objectives;比较级 more objective;最高级 most objective。二,意思不同:1...

objective是什么意思?
objective和goal的区别:一、指代不同 1、objective:目标,目的。2、goal:球门,射门。二、用法不同 1、objective:objective用作形容词的意思是“客观的,不带偏见的”,指以纯客观的眼光去观察事物或现象,不掺杂个人的情感与偏见。2、goal:goal的基本意思是“球门,进球得的分”,引申为“目标”,...

objective,object是什么意思?
objective:一、意思:adj. 客观的;真实的;宾语的 n. 目标;目的;[物]物镜;[语]宾语 二、发音:英 [əb'dʒektɪv] , 美 [əb'dʒektɪv]三、例句 From any objective perspective,it is simply too long.从客观的角度来讲,这实在是太长了。object...

goal 与objective的区别 哪个是大目标,哪个是小目标\\具体的目标_百度知 ...
2、objective 英[əbˈdʒektɪv] 美[əbˈdʒektɪv] adj. 客观的; 就事论事的; 不带个人感情的; 客观存在的; 基于事实的; 宾格的; n. 目的; 目标; (望远镜或显微镜的)物镜; 【用法】 goal的用法 goal的基本意思是“球门,进球得的分”,引申为“目标”,指遥远的大目标。 goal...

英语简历中的Objective是什么意思,主要写什么内容?
一份描述你专业抱负或是职业目标的陈述报告 A statement which expresses your

objective是什么意思?
objective可作形容词。作名词时,object倾向于指具体的“物件”,objective指目的、目标。object的基本意思是“物体”,指可见到或可触摸到的实物。object也可作“对象”“客体”解,指行为、感觉或思想所及的人或事物,常与介词of搭配使用。反义词 agree 英[əˈɡriː]美[ə&...

objective 和goal 有什么区别?
objective和goal的区别:一、指代不同 1、objective:目标,目的。2、goal:球门,射门。二、用法不同 1、objective:objective用作形容词的意思是“客观的,不带偏见的”,指以纯客观的眼光去观察事物或现象,不掺杂个人的情感与偏见。2、goal:goal的基本意思是“球门,进球得的分”,引申为“目标”,...

objective和object的区别
词性不同、用法不同等。objective主要作为形容词和名词使用。作为形容词时,它表示客观的,强调事物的真实性和不依赖于主观判断。作为名词时,则指代目标、目的或宗旨,表示努力争取或希望达到的事物或状态。而object则主要作为名词使用,既可以指代具体的物件或物体,也可以表示行动或努力的目标或宗旨。objecti...

target和objective有什么区别?
target 一般只是是方向性的指示,比如射击时瞄准,目标客户群体。objective 可指想达到的指标、任务等;比如年度任务目标,长期方针,这种情况下一般不用 target,只用 objective,但 objective 有时也可像 target 一样使用。比如学习成绩达到平均80分就是 objective,今年要达到的业绩目标也是 objective。凡是...

松山区17767451358: 如何理解 Objective - C 中的 strong 和 weak -
丹裕多磺: strong 修饰的属性会在赋值时调用被指向对象的 retain 方法,导致其引用计数加1 . weak 则不会. 另外还有个 unsafe_unretained,跟 weak 类似,区别是被指向对象消失时不会“自动“变成 nil . 如有疑问,请追问~ 如果有帮助,请采纳,O(∩_∩)O谢谢~

松山区17767451358: objective - c 中weak和strong使用的区别 -
丹裕多磺: (weak和strong)不同的是 当一个对象不再有strong类型的指针指向它的时候 它会被释放 ,即使还有weak型指针指向它.一旦最后一个strong型指针离去 ,这个对象将被释放,所有剩余的weak型指针都将被清除.可能有个例子形容是妥当的. ...

松山区17767451358: 如何使用 Runtime 给现有的类添加 weak 属性 -
丹裕多磺: Category是Objective-C中常用的语法特性,通过它可以很方便的为已有的类来添加函数.但是Category不允许为已有的类添加新的属性或者成员变量.一种常见的办法是通过runtime.h中objc_getAssociatedObject / objc_setAssociatedObject来访问和生成关联对象.通过这种方法来模拟生成属性.

松山区17767451358: Objective - C属性修饰符strong和copy的区别 -
丹裕多磺: 如两个对象NSString *str1=[[NSString alloc] initWithString:@"string1"]; NSString *str2=[[NSString alloc] initWithString:@"string2"]; str2=str1; //使指针str2的指向与str1指向相同内存.结果就是造成了上面的alloc下动态分配 的内存

松山区17767451358: iOS 如何正确使用block才不会造成内存泄漏 -
丹裕多磺: Block定义 Block作为C语言的扩展,并不是高新技术,和其他语言的闭包或lambda表达式是一回事.作用 Block可以访问函数以外、词法作用域以内的外部变量的值.换句话说,Block不仅 实现函数的功能,还能携带函数的执行环境.Block的类...

松山区17767451358: Objective - C中的加号和减号代表什么? -
丹裕多磺: 前置加号(+)的方法为类方法,这类方法是可以直接用类名来调用的,它的作用主要是创建一个实例.有人把它称为创建实例的工厂方法.前置减号(-)的方法为实例方法,必须使用类的实例才可以调用的.

松山区17767451358: 为什么说Objective - C很难学 -
丹裕多磺: 作为一个网络上的活跃分子,使用Objective-C的开发者,我收到了许多围绕Objective-C的提问.这些问题在人们学习Objective-C或者尝试开发app的时候会不断跳出来,而且其中的某些问题可能笼统如“Objective-C看起来太难了”也会细致若“...

松山区17767451358: object - c 中括号[]有什么特别的意义吗? -
丹裕多磺: 1. 用于通知某个对象该做什么即通知对象去执行某动作1.1. 在Objective-C中,方括号还有其它意义:它们用于通知某个对象该做什么.例如:[shape draw]; //这句话说明,通知对象shape去执行draw这个动作,例如让一个rectangle去画一个矩形...

松山区17767451358: Objective - C语言的优点有哪些? -
丹裕多磺: 1、动态运行环境,适合UI编程 在Objective-C中,如下语法并非单纯的函数调用,而是向某对象发送消息.2、方便与C/C++混合使用 Objective-C中的C扩展部分,使用符号@开头.比如@class、@interface、@"Hello,World".而它的消息发...

松山区17767451358: objective - c中属性和成员变量的默认描述分别是什么? -
丹裕多磺: 我的想法:1.首先 { NSArray *arry; // 等价于 __strong NSArray *arry; } 所以默认描述有 __srtong2. atomic 印象中是影响 setter/getter 的,这里自然没有了 所以这样看来,默认的描述就是 __strong 了

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网