Jak*_*old 365 properties objective-c ios ios5 automatic-ref-counting
有由ARC推出性能的两种新的内存管理的属性,strong和weak.
除了copy显然是完全不同的东西之外,vs 和vs 之间有什么区别吗?strongretainweakassign
根据我的理解,这里唯一的区别是weak将分配nil给指针,而assign不会,这意味着程序将在指针释放后向指针发送消息时崩溃.但是,如果我使用weak,这将永远不会发生,因为发送消息nil不会做任何事情.
我不知道strong和之间有什么不同retain.
是否有任何理由为什么我应该使用assign,并retain在新的项目,或者是那种被弃用?
swi*_*Boy 603
在阅读了很多文章Stackoverflow帖子和演示应用程序来检查变量属性属性后,我决定将所有属性信息放在一起:
下面是详细的文章链接,您可以在其中找到上面提到的所有属性,这肯定会对您有所帮助.非常感谢所有在这里给出最佳答案的人!
1.strong(iOS4 =保留)
例:
@property (strong, nonatomic) ViewController *viewController;
@synthesize viewController;
2.weak -
示例:
@property (weak, nonatomic) IBOutlet UIButton *myButton;
@synthesize myButton;
强烈而微弱的解释,感谢BJ荷马:
想象一下,我们的对象是一只狗,狗想要逃跑(被解除分配).
强壮的指针就像是狗的皮带.只要你的皮带附着在狗身上,狗就不会逃跑.如果五个人将他们的皮带连接到一只狗,(五个强指针指向一个物体),那么在所有五个皮带脱落之前,狗不会逃跑.
另一方面,弱点就像小孩子指着那只狗说"看!一只狗!" 只要狗仍然在皮带上,小孩子仍然可以看到狗,他们仍然会指向它.然而,一旦所有的皮带脱落,无论有多少小孩指着它,狗都会跑开.
一旦最后一个强指针(皮带)不再指向一个对象,该对象将被释放,并且所有弱指针都将被清零.
当我们使用弱者?
你想要使用弱的唯一一次是,如果你想避免保留周期(例如父母保留孩子而孩子保留父母,所以两者都没有被释放).
3.retain = strong
例:
@property (nonatomic, retain) NSString *name;
@synthesize name;
4.assign
例:
@property (nonatomic, assign) NSString *address;
@synthesize address;
Jer*_*myP 229
从过渡到ARC发行说明(属性属性部分中的示例).
// The following declaration is a synonym for: @property(retain) MyClass *myObject;
@property(strong) MyClass *myObject;
因此strong与retain财产声明中的相同.
对于ARC项目,我将使用strong而不是retain,我将assign用于C原始属性和weak对Objective-C对象的弱引用.
Tri*_*ops 39
据我所知,strong并且retain是同义词,所以它们完全相同.
然后weak几乎就像assign,但是在对象之后自动设置为nil,它指向,被释放.
这意味着,您可以简单地替换它们.
但是,我遇到过一个特殊情况,我必须使用assign,而不是weak.比方说,我们有两个属性delegateAssign和delegateWeak.两者都存储了我们的代表,即拥有唯一强大的参考资料.委托正在解除分配,因此我们的-dealloc方法也被调用.
// Our delegate is deallocating and there is no other strong ref.
- (void)dealloc {
    [delegateWeak doSomething];
    [delegateAssign doSomething];
}
委托已经处于释放过程中,但仍未完全取消分配.问题是weak对他的引用已经无效!属性delegateWeak包含nil,但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变量如何工作以及它们何时无效.
Vad*_*off 39
Min*_*ing 20
Clang关于Objective-C自动参考计数(ARC)的文档清楚地解释了所有权限定符和修饰符:
有四个所有权限定符:
- __ 自动释放
- __ 强
- __*unsafe_unretained*
- __ 弱
如果类型具有__ autoreleasing,__ strong或__ weak限定,则该类型具有非平凡的所有权限定.
然后,声明属性有六个所有权修饰符:
- assign暗示__*unsafe_unretained*所有权.
- copy意味着__ 强主权,以及setter上复制语义的通常行为.
- 保留意味着__ 强大的所有权.
- 强烈意味着__ 强大的所有权.
- *unsafe_unretained*暗示__*unsafe_unretained*所有权.
- 弱意味着__ 弱所有权.
除弱点外,这些修饰符可在非ARC模式下使用.
语义学上,所有权限定符在五个管理操作中具有不同的含义:阅读,分配,初始化,销毁和移动,其中大多数时候我们只关心分配操作中的差异.
分配评估赋值运算符时出现.语义因资格而异:
- 对于__ 强对象,首先保留新的指针; 第二,左值加载了原始语义; 第三,新的指针被存储到具有原始语义的左值中; 最后,老指针被释放了.这不是原子地执行的; 必须使用外部同步,以便在并发加载和存储时使其安全.
- 对于__ 弱对象,左值更新为指向新的指针,除非新的指针对象是当前正在进行解除分配的对象,在这种情况下,左值更新为空指针.这必须相对于对象的其他赋值,从对象读取以及新指针的最终版本以原子方式执行.
- 对于__*unsafe_unretained*对象,新的指针对象使用原始语义存储到左值中.
- 对于__ 自动释放对象,新的指针对象将被保留,自动释放,并使用原始语义存储到左值中.
阅读,初始化,销毁和移动的另一个区别,请参阅文档中的第4.2节语义.
要理解强引用和弱引用,请考虑以下示例,假设我们有名为 displayLocalVariable 的方法。
 -(void)displayLocalVariable
  {
     NSString myName = @"ABC";
     NSLog(@"My name is = %@", myName);
  }
在上述方法中,myName 变量的范围仅限于 displayLocalVariable 方法,一旦该方法完成,保存字符串“ABC”的 myName 变量将从内存中释放。
现在,如果我们想在整个视图控制器生命周期中保存 myName 变量值怎么办。为此,我们可以创建名为 username 的属性,该属性将对变量 myName 具有强引用(见self.username = myName;下面的代码),如下所示,
@interface LoginViewController ()
@property(nonatomic,strong) NSString* username;
@property(nonatomic,weak) NSString* dummyName;
- (void)displayLocalVariable;
@end
@implementation LoginViewController
- (void)viewDidLoad
{
    [super viewDidLoad];
}
-(void)viewWillAppear:(BOOL)animated
{
     [self displayLocalVariable];
}
- (void)displayLocalVariable
{
   NSString myName = @"ABC";
   NSLog(@"My name is = %@", myName);
   self.username = myName;
}
- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
}
@end
现在在上面的代码中,您可以看到 myName 已分配给 self.username 并且 self.username 具有对 myName 的强引用(正如我们在接口中使用@property 声明的那样)(间接地它对“ABC”字符串具有强引用)。因此 String myName 不会从内存中释放,直到 self.username 还活着。
现在考虑将 myName 分配给 dummyName,这是一个弱引用,self.dummyName = myName; 与强引用不同,Weak 只会保留 myName 直到对 myName 有强引用。请参阅下面的代码以了解弱引用,
-(void)displayLocalVariable
  {
     NSString myName = @"ABC";
     NSLog(@"My name is = %@", myName);
     self.dummyName = myName;
  }
在上面的代码中有对 myName 的弱引用(即 self.dummyName 对 myName 有弱引用)但没有对 myName 的强引用,因此 self.dummyName 将无法保存 myName 值。
现在再次考虑下面的代码,
-(void)displayLocalVariable
      {
         NSString myName = @"ABC";
         NSLog(@"My name is = %@", myName);
         self.username = myName;
         self.dummyName = myName;
      } 
在上面的代码中,self.username 有一个对 myName 的强引用,因此即使在方法结束之后 self.dummyName 现在也会有一个 myName 值,因为 myName 有一个与之关联的强引用。
现在,每当我们对一个变量进行强引用时,它的保留计数都会增加 1,并且该变量不会被释放,保留计数会达到 0。
希望这可以帮助。
| 归档时间: | 
 | 
| 查看次数: | 192118 次 | 
| 最近记录: |