Objective-C'de zayıf ve güçlü özellik belirleyici nitelikleri


94

Objective-C'deki zayıf ve güçlü özellik belirleyici nitelikleri arasındaki fark nedir?

@property(retain, [weak/strong]) __attribute__((NSObject)) CFDictionaryRef myDictionary;

Etkisi ve faydası nedir?

Zayıflığın iOS 4'te bulunmadığını duydum ve atamayı kullanmamız gerekiyor.

Zayıf, atamaya benzer mi?


Yanıtlar:


102

Belirli bir dosya için ARC'ye sahipsiniz ya da kapalısınız. Açıksa retain release autoreleaseetc kullanamazsınız ... Bunun yerine strong weaközellikler için veya __strong __weak değişkenler için kullanırsınız (varsayılan olarak __strong). Strong, tutmaya eşdeğerdir, ancak ARC sizin için sürümü yönetecektir.

Zayıf kullanmak isteyeceğiniz tek zaman, döngüleri önlemek istemenizdir (örneğin, ebeveyn çocuğu elinde tutar ve çocuk ebeveyni elinde tutar, böylece ikisi de asla serbest bırakılmaz).

'Geçiş ücreti serbest köprü' kısmı (yayın yapmak NSiçin CF) biraz zordur. Yine de elle yönetmek zorunda CFRelease()ve CFRetain()CF nesneler için. Bunları tekrar NS nesnelerine dönüştürdüğünüzde, ne yaptığınızı bilmesi için derleyiciye tutma sayımı hakkında bilgi vermeniz gerekir.

Hepsi burada .


120

İşte değişken özellikleri hakkında bildiklerim

  1. atomik // varsayılan
  2. atom olmayan
  3. strong = muhafaza // varsayılan
  4. güçsüz
  5. muhafaza etmek
  6. ata // varsayılan
  7. güvensiz_ tutulmayan
  8. kopya
  9. Sadece oku
  10. okuma yazma // varsayılan

Bu yüzden aşağıda, yukarıda belirtilen tüm öznitelikleri bulabileceğiniz, meydan okurcasına size yardımcı olacak ayrıntılı makale bağlantısı bulunmaktadır. Burada en iyi cevapları veren herkese çok teşekkürler !!

İOS'ta değişken özellik öznitelikleri veya Değiştiriciler

01. güçlü (iOS4 = tutma) - "bunu artık işaret etmeyene kadar yığında tut" diyor - başka bir deyişle "sahibim, bunu elde tutma gibi iyi nişan almadan önce bunu kaldıramazsın "- Yalnızca nesneyi tutmanız gerektiğinde güçlü kullanırsınız. - Varsayılan olarak tüm örnek değişkenleri ve yerel değişkenler güçlü işaretçilerdir. - Genellikle UIViewControllers (UI öğesinin üst öğeleri) için güçlü kullanırız - güçlü ARC ile kullanılır ve temelde bir nesnenin tutma sayısı hakkında endişelenmenize gerek kalmadan size yardımcı olur. ARC, işiniz bittiğinde sizin için otomatik olarak serbest bırakır. Strong anahtar sözcüğünü kullanmak, nesneye sahip olduğunuz anlamına gelir.

Misal:

@property (strong, nonatomic) ViewController *viewController;

@synthesize viewController;

02. zayıf (iOS4 = unsafe_unretained) - "başkası güçlü bir şekilde işaret ettiği sürece bunu sakla" diyor - atama, tutma veya bırakma ile aynı şey - "Zayıf" bir referans, tutmadığınız bir referanstır. - IBOutlets (UIViewController's Childs) için genellikle zayıf kullanırız. Bu işe yarar çünkü alt nesnenin yalnızca üst nesne olduğu sürece var olması gerekir. - zayıf başvuru, başvurulan nesneyi çöp toplayıcı tarafından toplanmaya karşı korumayan bir referanstır. - Zayıf, esasen devredilmemeli bir mülktür. Nesnenin serbest bırakıldığı durumlar dışında, zayıf işaretçi otomatik olarak sıfıra ayarlanır.

Misal :

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

@synthesize myButton;

Açıklayın : BJ Homer'a teşekkürler

Nesnemizin bir köpek olduğunu ve köpeğin kaçmak istediğini (ayrılmak) hayal edin. Güçlü işaretçiler köpek tasması gibidir. Köpeğe tasma takılı olduğu sürece köpek kaçmayacaktır. Eğer beş kişi tasmasını bir köpeğe bağlarsa (bir nesneye beş güçlü işaret), bu durumda köpek beş tasmanın tamamı çıkana kadar kaçmayacaktır. Öte yandan zayıf işaretçiler, köpeği işaret edip "Bak! Bir köpek!" Diyen küçük çocuklar gibidir. Köpek hala tasmalı olduğu sürece, küçük çocuklar hala köpeği görebilirler ve yine de onu gösterirler. Bununla birlikte, tüm tasmalar çıkar çıkmaz, köpek kaç küçük çocuk işaret ederse etsin, kaçar. Son güçlü işaretçi (tasma) artık bir nesneyi işaret etmediği anda, nesnenin dağıtımı kaldırılacak ve tüm zayıf işaretçiler sıfırlanacaktır. Zayıf kullandığımız zaman? Zayıf kullanmak isteyeceğiniz tek zaman, döngüleri önlemek istemenizdir (örneğin, ebeveyn çocuğu elinde tutar ve çocuk ebeveyni elinde tutar, böylece ikisi de asla serbest bırakılmaz).


1
İlk listede, "varsayılan" ile ne demek istediğinizden pek emin değilim. Her ikisine de sahipsiniz strong=retainve assignvarsayılan olarak etiketlediniz, ancak ikisi birden olamaz.
Slipp D. Thompson

27
Tasma karşılaştırmasında köpeğin tadını çıkardım. Oldukça iyi açıklıyor.
Jarrett Barnett

1
İyi bir açıklama, iOS çöp toplama kullanmasa da. ARC! = Çöp toplama (!), Bunlar farklı teknolojilerdir.

1
zayıf ve güvenli olmayan_ tutulmayan farklıdır (ilki sıfırlama zayıf referansları kullanır, ikincisi çömelir)
wcochran

1
Sadece iOS öğreniyorum, ancak yanlış olduğunu gibi görünüyor weakve strongsizin örneklerde. Bir ebeveynin strongçocuklarına referansları olması ( sizin gösterdiğiniz sınıfın myButtonözelliği UIViewControllerolarak weak) ve çocukların weakebeveynlerine referanslar tutması ( viewControllersizin ve bunun yerine) olarak ayarlayın strong. Örneğin, Matt Neuburg'un kitabını okumak iOS 7 Programming Fundamentals, delegesini mülk olarak ilan eden bir sınıfın onu zayıf tutacağını gösteriyor, bu adil görünüyor.
Bogdan Alexandru

2

Dokümanların Robert tarafından atıfta bulunulan, son iki sorunuzu açıkça cevaplayan kısımlarını belirtmek için:

// The following declaration is similar to "@property(assign) MyClass *myObject;"
// except that if the MyClass instance is deallocated,
// the property value is set to nil instead of remaining as a dangling pointer.
@property(weak) MyClass *myObject;

Bu, sıfırlama zayıf referans olarak adlandırılır. __Unsafe_unretained kullanarak zayıf referansları sıfırlamayan zayıf referanslar oluşturabilirsiniz, ancak adından da anlaşılacağı gibi bu genellikle önerilmez.

Ayrıca belgelerde:

Weak references are not supported in Mac OS X v10.6 and iOS 4.

1
Evet bu doğru, __unsafe_unretainedARC sürümü assign.
Robert

2

ZAYIF özelliğinin kristal netliğinde kullanımı aşağıdaki gibidir:

Any control whose properties we need to change(eg:text of a label) is declared weak and as below:

@property(nonatomic,weak) IBOutlet Type *name;
Eg: @property(nonatomic,weak) IBOutlet UILabel *myLabel;

1
Özelliklerimde zayıf kullanarak, "Zayıf alıcı öngörülemeyen bir şekilde sıfıra ayarlanmış olabilir" şeklinde bir uyarı alıyorum. Bu uyarıyı önlemek için yerel güçlü bir referans oluşturmanız gereken başka yazılar da gördüm. Ve eğer bu doğruysa, sonunda güçlü bir referans oluşturmam gerekiyorsa, bir mülkü zayıflatmanın ne anlamı var?
ArH

0

daha fazla ayrıntı için bir örnek alalım (yukarıdaki cevap zaten harika), bu örnek biraz daha yardımcı olabilir mi?

iki sınıf A ve B olsun

//A.h

#import <Foundation/Foundation.h>
#import "B.h"

@interface A : NSObject

@property (nonatomic, strong) B *objB;

@end

@implementation A
//

@end

//B.h

    #import <Foundation/Foundation.h>
    #import "A.h"


    @interface B : NSObject

    @property strong text(nonatomic, strong) A *objA;

    @end

    @implementation B
    //

    @end

    and in main

    #import "B.h"
    #import "A.h"

    {
    A *obja =[[A alloc]init];
    B *objb =[[B alloc]init];
    A.objB=objb;
    B.objA=obja;
   }

yukarıdaki kod bir tutma döngüsü oluşturacaktır çünkü her ikisi de güçlü tip a --------> b ---------> a

Bu nedenle, bundan kaçınmak için, nesneye haftalık olarak başvurması ve referans sayısını artırmaması için bir tanesinin week özelliğini kullanmanız gerekir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.