首页 文章

Objective-C中强弱之间的差异

提问于
浏览
292

我是Obj-C的新手,所以我的第一个问题是:

在指向对象的指针的 @property 声明中 strongweak 之间有什么区别?

另外, nonatomic 是什么意思?

9 回答

  • 21

    考虑气球方面的强弱参考可能会有所帮助 .

    只要至少有一个人握住附着在其上的绳子,气球就不会飞走 . 持有字符串的人数是保留计数 . 当没有人 grab 绳子时,气球会飞走(dealloc) . 许多人可以使用同一个气球的字符串 . 您可以使用强引用和弱引用来获取/设置属性并在引用的对象上调用方法 .

    一个强大的参考就像持有一个字符串到那个气球 . 只要您 grab 连接到气球的绳子,它就不会飞走 .

    弱参考就像看气球一样 . 你可以看到它,访问它的属性,调用它的方法,但你没有该气球的字符串 . 如果每个人都 grab 绳子放开,气球飞走了,你再也无法进入了 .

  • 621

    强引用(在大多数情况下将使用)意味着您希望__77656_使用此属性/变量引用的对象 . 只要您指向具有强引用的对象,编译器就会注意您分配给此属性的任何对象都不会被销毁 . 只有将属性设置为 nil 后,对象才会被销毁(除非一个或多个其他对象也拥有对它的强引用) .

    相比之下,如果参考较弱,则表示您的生命周期为_477658 . 您引用弱的对象仅存在,因为至少有一个其他对象拥有强引用 . 一旦不再是这种情况,对象就会被破坏,你的弱属性将自动设置为 nil . iOS中最常见的弱引用用例是:

    • 委托属性,通常被弱引用以避免保留周期,以及

    • 视图控制器主视图的子视图/控件,因为主视图已经强烈保存了这些视图 .

    原子与非原子是指编译器为属性合成的getter和setter方法的线程安全性 . atomic(默认值)告诉编译器使访问器方法成为线程安全的(通过在访问ivar之前添加一个锁),而非原子反义词则相反 . 非原子的优点是性能略高 . 在iOS上,Apple几乎使用非原子属性,因此一般建议您也可以这样做 .

  • 6

    strong :为其分配传入值,它将保留传入值并释放实例变量的现有值

    weak :将传入的值分配给它而不保留它 .

    所以基本的区别在于保留新变量 . 通常你想要保留它,但有些情况下你不想拥有它,否则你将得到一个保留周期并且不能释放对象的内存 . 例如 . obj1保留obj2,obj2保留obj1 . 要解决这种情况,请使用弱引用 .

  • 8

    A dummy answer :-

    我认为上面的答案给出了解释,所以我只是告诉你在哪里使用 STRONG 以及在哪里使用 WEAK :

    Use of Weak :- 1.代表2.奥特莱斯3.子目录4.控制等

    Use of Strong :- 保留在 WEAK 中未包含的所有地方 .

  • 12

    strongweak ,这些关键字围绕着Objective-C中的 Object Ownership

    What is object ownership ?

    指针变量意味着它们指向的对象的所有权 .

    • 当方法(或函数)具有指向对象的局部变量时,该变量被称为拥有指向的对象 .

    • 当一个对象具有指向另一个对象的实例变量时,具有指针的对象被称为拥有被指向的对象 .

    无论何时指针变量指向一个对象,该对象都有一个所有者并将保持活跃状态 . 这被称为 strong 参考 .

    变量可以选择不取得它指向的对象的所有权 . 不取得对象所有权的变量称为 weak 引用 .

    在这里查看详细说明Demystifying @property and attributes

  • 1

    为了理解Strong和Weak引用,请考虑下面的示例,假设我们有一个名为displayLocalVariable的方法 .

    -(void)displayLocalVariable
      {
         NSString myName = @"ABC";
         NSLog(@"My name is = %@", myName);
      }
    

    在上面的方法中,myName变量的范围仅限于displayLocalVariable方法,一旦方法完成,保存字符串“ABC”的myName变量将从内存中释放出来 .

    现在,如果我们想在整个视图控制器生命周期中保存myName变量值,该怎么办呢?为此,我们可以创建名为username的属性,该属性将具有对myName变量的强引用(请参阅下面的代码中的 @property(nonatomic,strong) NSString* username;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有一个强引用(我们在接口中使用@property声明)到myName(间接它具有对“ABC”字符串的强引用) . 因此,在my.username处于活动状态之前,String myName不会从内存中释放 .

    • 弱参考

    现在考虑将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具有与之关联的Strong引用 .

    现在,每当我们对变量进行强引用时,它的保留计数增加1,并且变量将不会被释放,直到我的保留计数达到0 .

    希望这可以帮助 .

  • 1

    在这里, Apple Documentation 使用各种示例解释了弱属性和强属性之间的区别:

    https://developer.apple.com/library/ios/documentation/cocoa/conceptual/ProgrammingWithObjectiveC/EncapsulatingData/EncapsulatingData.html#//apple_ref/doc/uid/TP40011210-CH5-SW3

    在这里,作者已经在同一个地方收集了所有属性 . 它将有助于比较属性特征:

    http://rdcworld-iphone.blogspot.in/2012/12/variable-property-attributes-or.html

  • 6

    strong 是默认值 . 只要存在指向它的强指针,对象就会保持“活着” .

    weak 指定不使引用的对象保持活动状态的引用 . 当没有对该对象的强引用时,弱引用设置为nil .

  • 670

    Strong :基本上使用属性我们用来从/向另一个类获取或发送数据 . Weak :通常所有插座,连接都是接口的弱类型 .

    Nonatomic :当我们不想将我们的插座或对象共享到不同的同时线程中时,会使用这种类型的属性 . 换句话说,Nonatomic实例使我们的属性一次处理一个线程 . 希望它对你有所帮助 .

相关问题