亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

目標-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 關注
  • 557 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號