SORU
21 HAZİRAN 2013, Cuma


CFStringRef için NSString ve ARK NSString için CFStringRef?

ARK CFStringRef NSString bir almanın doğru bir şekilde anlamaya çalışıyorum? Ters yönde, CFStringRef YAY NSString gitmek için aynı mı?

Bellek sızıntısı oluşturmadan bunu yapmak için doğru yolu nedir?

CEVAP
23 HAZİRAN 2013, Pazar


Genellikle

NSString *yourFriendlyNSString = (__bridge NSString *)yourFriendlyCFString;

ve

CFStringRef yourFriendlyCFString = (__bridge CFStringRef)yourFriendlyNSString;

Eğer __bridge anahtar var, nedenini öğrenmek istiyorsan, Apple documentation başvurabilirsiniz. Orada bulacaksınız:

__bridgemülkiyet transferi ile Objective-C ve Temel arasında bir işaretçi aktarır.

__bridge_retainedyaCFBridgingRetainatmalarını Objective-C Çekirdek bir Vakıf pointer da pointer transferler bir sahiplik. Sorumlu CFRelease veya nesnenin sahipliğini vazgeçmek ile ilgili bir fonksiyonu çağırıyorsunuz.

__bridge_transferyaCFBridgingReleasehamle non-Objective-C işaretçi Objective-C ve ayrıca transferler bir ARC için mülkiyet. ARC nesnesi feragat mülkiyet sorumludur.

Yukarıda belirtilen durumlarda mülkiyet değiştirmeden nesne döküm olduğunuz anlamına gelir. Bu iki durumda da dizelerin anısına idaresinden sorumlu olacak anlamına gelir.

Ayrıca bazı nedenlerden dolayı devretmek için istediğiniz durumda olabilir.

Örnek olarak aşağıdaki kod

- (void)sayHi {
    CFStringRef str = CFStringCreateWithCString(NULL, "Hello World!", kCFStringEncodingMacRoman);

    NSString * aNSString = (__bridge NSString *)str;

    NSLog(@"%@", aNSString);

    CFRelease(str); //you have to release the string because you created it with a 'Create' CF function
}

böyle bir durumda döküm sahiplik aktarımı CFRelease kaydetmek isteyebilirsiniz.

- (void)sayHi {
    CFStringRef str = CFStringCreateWithCString(NULL, "Hello World!", kCFStringEncodingMacRoman);

    NSString * aNSString = (__bridge_transfer NSString *)str;
// or alternatively
    NSString * aNSString = (NSString *)CFBridgingRelease(str);

    NSLog(@"%@", aNSString);
}

str mülkiyeti transfer oldu, şimdi ARC tekme ve bellek yayınlayacak.

Diğer taraftan edebilirsiniz dökme NSString * CFString __bridge_retained koyun, böylece sen-ecek kendi nesne ve size açıkça serbest kullanarak CFRelease.


O kadar tamamlamak için olabilir

NSString &yani; CFString

// Don't transfer ownership. You won't have to call `CFRelease`
CFStringRef str = (__bridge CFStringRef)string;

// Transfer ownership (i.e. get ARC out of the way). The object is now yours and you must call `CFRelease` when you're done with it
CFStringRef str = (__bridge_retained CFStringRef)string // you will have to call `CFRelease`

CFString &yani; NSString

// Don't transfer ownership. ARC stays out of the way, and you must call `CFRelease` on `str` if appropriate (depending on how the `CFString` was created)
NSString *string = (__bridge NSString *)str;

// Transfer ownership to ARC. ARC kicks in and it's now in charge of releasing the string object. You won't have to explicitly call `CFRelease` on `str`
NSString *string = (__bridge_transfer NSString *)str;

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Glyn Dewis

    Glyn Dewis

    25 AĞUSTOS 2007
  • Jonnyriddlin1

    Jonnyriddlin

    4 Ocak 2007
  • Miles Fisher

    Miles Fisher

    8 NİSAN 2009