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

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

ARC引入的属性有两个新的内存管理属性,strongweak.

除了copy这显然是完全不同的东西,在.之间有什么区别吗?strongVSretainweakVSassign?

据我理解,这里唯一的区别是weak将分配nil指向指针,而assign不会,这意味着程序将崩溃,当我发送一条消息到指针一旦释放。但如果我用weak,这是不可能发生的,因为信息发送给nil什么也做不了。

我不知道在strongretain.

我有什么理由要用assignretain在新的项目中,还是被反对的类型?


慕丝7291255
浏览 518回答 3
3回答

30秒到达战场

从过渡到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对象的弱引用。

红糖糍粑

在阅读了大量文章之后,我决定将所有属性信息放在一起:原子/缺省非原子强=保留/违约瘦弱保留指定/默认不安全未保留复制只读阅读/默认下面是详细的文章链接,在这里你可以找到上面提到的所有属性,这肯定会对你有帮助。感谢所有在这里给出最好答案的人!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;

慕田峪7331174

就我所知道,strong和retain是同义词,所以一点儿没错同样的。然后weak几乎就像assign,但在对象(它所指向的)被解除分配之后,自动设置为零。这意味着,你可以简单地替换它们。不过,我遇到了一个特殊情况,我不得不用assign,而不是weak..假设我们有两个属性delegateAssign和delegateWeak..在这两种情况下都存储了我们的委托,这是通过拥有唯一的强引用来拥有我们的。委托正在释放,所以我们的-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变量起作用,当它们被空化时。
打开App,查看更多内容
随时随地看视频慕课网APP