为了账号安全,请及时绑定邮箱和手机立即绑定

目标-C ARC:强vs保留和弱vs分配

目标-C ARC:强vs保留和弱vs分配

慕丝7291255 2019-07-12 15:49:27
目标-C ARC:强vs保留和弱vs分配ARC引入的属性有两个新的内存管理属性,strong和weak.除了copy这显然是完全不同的东西,在.之间有什么区别吗?strongVSretain和weakVSassign?据我理解,这里唯一的区别是weak将分配nil指向指针,而assign不会,这意味着程序将崩溃,当我发送一条消息到指针一旦释放。但如果我用weak,这是不可能发生的,因为信息发送给nil什么也做不了。我不知道在strong和retain.我有什么理由要用assign和retain在新的项目中,还是被反对的类型?
查看完整描述

3 回答

?
30秒到达战场

TA贡献1828条经验 获得超6个赞

过渡到ARC发行说明(属性一节中的示例)。

// The following declaration is a synonym for: @property(retain) MyClass *myObject;@property(strong) MyClass *myObject;

所以strong是相同的retain在财产声明中。

对于ARC项目,我将使用strong而不是retain,我会用assign对于C基元性质和weak对于目标C对象的弱引用。


查看完整回答
反对 回复 2019-07-12
?
红糖糍粑

TA贡献1815条经验 获得超6个赞

在阅读了大量文章之后,我决定将所有属性信息放在一起:

  1. 原子/缺省
  2. 非原子
  3. 强=保留/违约
  4. 瘦弱
  5. 保留
  6. 指定/默认
  7. 不安全未保留
  8. 复制
  9. 只读
  10. 阅读/默认

下面是详细的文章链接,在这里你可以找到上面提到的所有属性,这肯定会对你有帮助。感谢所有在这里给出最好答案的人!

IOS中的可变属性或修饰符

1.强(iOS 4=保留)

  • 上面写着“把这个放在堆里直到我不再指着它”
  • 换句话说,“我是业主,你不能在此之前取消这一目标,与保留一样好”
  • 只有在需要保留对象时才使用Strong。
  • 默认情况下,所有实例变量和局部变量都是强指针。
  • 我们通常对UIViewControlers(UI项的父级)使用强
  • Strong与ARC一起使用,它基本上可以帮助您,不必担心对象的保留计数。当你完成它时,弧形自动释放它。使用关键字强意味着你拥有这个对象。

例子:

@property (strong, nonatomic) ViewController *viewController;@synthesize viewController;

2.弱 -

  • 上面写着“只要别人强烈地指点,就留着这个”
  • 与分配相同,不保留或释放
  • “弱”引用是指不保留的引用。
  • 我们通常将弱用于IBOutlet(UIViewController的子程序),这是因为只要父对象存在,子对象就会存在。
  • 弱引用是不保护引用对象免受垃圾收集器回收的引用。
  • 弱本质上是赋值,是一种未保留的属性。除了当对象被解除分配时,弱指针将自动设置为零。

例子:

@property (weak, nonatomic) IBOutlet UIButton *myButton;@synthesize myButton;

强而弱的解释,感谢BJ·荷马:

假设我们的目标是一只狗,而狗想要逃跑(被取消分配)。

有力的指针就像一根拴在狗身上的绳子。只要你把皮带系在狗身上,狗就不会跑掉。如果五个人把他们的皮带附在一只狗身上(五个强指针指向一个物体),那么这只狗将不会逃跑,直到所有五条皮带都被分离。

另一方面,弱指针就像小孩子指着狗说:“看!一只狗!”只要狗还在皮带上,孩子们还能看见那只狗,他们还会指着它。然而,一旦所有的皮带都分开了,狗就跑掉了,不管有多少小孩指着它。

一旦最后一个强指针(Leash)不再指向一个对象,该对象将被释放,所有弱指针都将被归零。

当我们用弱的时候?

只有当您想要使用“弱”时,如果您希望避免保留周期(例如,父级保留子级,子级保留父级,因此两个版本都不会发布)。

3.保留=强

  • 它被保留,旧值被释放并被赋值,它指定了应该发送的新值。
  • 保留赋值和发送的旧值-释放
  • 保留和坚强是一样的。
  • 苹果说,如果你写,保留,它将自动转换/工作像强者。
  • 像“alloc”这样的方法包括一个隐含的“保留”。

例子:

@property (nonatomic, retain) NSString *name;@synthesize name;

4.分配

  • 赋值是默认的,只需执行变量赋值。
  • “赋值”是一个属性,它告诉编译器如何合成属性的setter实现
  • 我会使用赋值来表示C基元属性,而弱引用用于对象-C对象的弱引用。

例子:

@property (nonatomic, assign) NSString *address;@synthesize address;


查看完整回答
反对 回复 2019-07-12
?
慕田峪7331174

TA贡献1828条经验 获得超13个赞

就我所知道,strongretain是同义词,所以一点儿没错同样的。

然后weak几乎就像assign,但在对象(它所指向的)被解除分配之后,自动设置为零。

这意味着,你可以简单地替换它们。

不过,我遇到了一个特殊情况,我不得不用assign,而不是weak..假设我们有两个属性delegateAssigndelegateWeak..在这两种情况下都存储了我们的委托,这是通过拥有唯一的强引用来拥有我们的。委托正在释放,所以我们的-dealloc方法也被调用。

// Our delegate is deallocating and there is no other strong ref.- (void)dealloc {
    [delegateWeak doSomething];
    [delegateAssign doSomething];}

委托已在取消分配过程中,但仍未完全解除分配。问题是weak对他的引用已经无效了!财产delegateWeak包含零,但是delegateAssign包含有效对象(所有属性都已释放并无效,但仍然有效)。

// Our delegate is deallocating and there is no other strong ref.- (void)dealloc {
    [delegateWeak doSomething]; // Does nothing, already nil.
    [delegateAssign doSomething]; // Successful call.}

这是非常特殊的情况,但它揭示了我们是如何weak变量起作用,当它们被空化时。


查看完整回答
反对 回复 2019-07-12
  • 3 回答
  • 0 关注
  • 517 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信