SORU
21 Temmuz 2011, PERŞEMBE


ARC ile,'in daha iyi ne: ayırma veya autorelease başlatıcılar?

alloc autorelease başlatıcılar kullanmak daha iyi (daha hızlı ve daha verimli). E. g.:

- (NSString *)hello:(NSString *)name {
    return [[NSString alloc] initWithFormat:@"Hello, %@", name];
}

YA

- (NSString *)hello:(NSString *)name {
    return [NSString stringWithFormat:@"Hello, %@", name];
//    return [@"Hello, " stringByAppendingString:name]; // even simpler
}

Çoğu durumda, performans burada önemli olmadığını biliyorum. Ama, yine de daha iyi şekilde yapma alışkanlığı olsun istiyorum.

Eğer aynı şeyi yaparlarsa, o zaman yazın daha kısa ve daha okunabilir, çünkü ben ikinci seçeneği tercih ederim.

4.2 bir ARK*11, *, autorelease, **12 vb koyduğu, yani, derler ne olduğunu görmek için böyle büyük mükafat? Bu özelliğin üzerinde ARC değiştirirken çok yararlı olacaktır. Bu şeyler hakkında düşünmek zorunda olmaması gerektiğini biliyorum, ama bana bu gibi soruların cevabı anlamaya yardımcı olur.

CEVAP
9 AĞUSTOS 2011, Salı


Fark ince ama autorelease sürümleri tercih edilmelidir. Öncelikle, kodunuzu daha okunabilir. İkinci olarak, optimize edilmiş montaj çıktı incelenmesi, autorelease Bu sürüm biraz daha iyi.

autorelease sürümü

- (NSString *)hello:(NSString *)name {
    return [NSString stringWithFormat:@"Hello, %@", name];
}

çevirir

"-[SGCAppDelegate hello:]":
    push    {r7, lr}
    movw    r1, :lower16:(L_OBJC_SELECTOR_REFERENCES_-(LPC0_0 4))
    mov r3, r2
    movt    r1, :upper16:(L_OBJC_SELECTOR_REFERENCES_-(LPC0_0 4))
    movw    r0, :lower16:(L_OBJC_CLASSLIST_REFERENCES_$_-(LPC0_1 4))
    movt    r0, :upper16:(L_OBJC_CLASSLIST_REFERENCES_$_-(LPC0_1 4))
    add r1, pc
    add r0, pc
    mov r7, sp
    ldr r1, [r1]
    ldr r0, [r0]
    movw    r2, :lower16:(L__unnamed_cfstring_-(LPC0_2 4))
    movt    r2, :upper16:(L__unnamed_cfstring_-(LPC0_2 4))
    add r2, pc
    blx _objc_msgSend    ; stringWithFormat:
    pop {r7, pc}

[[Ayırma] init] oysa sürümü aşağıdaki gibi görünür:

"-[SGCAppDelegate hello:]":
    push    {r4, r5, r6, r7, lr}
    movw    r1, :lower16:(L_OBJC_SELECTOR_REFERENCES_2-(LPC1_0 4))
    add r7, sp, #12
    movt    r1, :upper16:(L_OBJC_SELECTOR_REFERENCES_2-(LPC1_0 4))
    movw    r0, :lower16:(L_OBJC_CLASSLIST_REFERENCES_$_-(LPC1_1 4))
    movt    r0, :upper16:(L_OBJC_CLASSLIST_REFERENCES_$_-(LPC1_1 4))
    add r1, pc
    add r0, pc
    ldr r5, [r1]
    ldr r6, [r0]
    mov r0, r2
    blx _objc_retain    ; ARC retains the name string temporarily
    mov r1, r5
    mov r4, r0
    mov r0, r6
    blx _objc_msgSend   ; call to alloc
    movw    r1, :lower16:(L_OBJC_SELECTOR_REFERENCES_4-(LPC1_2 4))
    mov r3, r4
    movt    r1, :upper16:(L_OBJC_SELECTOR_REFERENCES_4-(LPC1_2 4))
    add r1, pc
    ldr r1, [r1]
    movw    r2, :lower16:(L__unnamed_cfstring_-(LPC1_3 4))
    movt    r2, :upper16:(L__unnamed_cfstring_-(LPC1_3 4))
    add r2, pc
    blx _objc_msgSend   ; call to initWithFormat:
    mov r5, r0
    mov r0, r4
    blx _objc_release   ; ARC releases the name string
    mov r0, r5
    pop.w   {r4, r5, r6, r7, lr}
    b.w _objc_autorelease

Beklendiği gibi, alloc initWithFormat: çağrı yöntemleri olduğu için biraz daha uzun. Özellikle ilginç olan ARK name dize (_objc_retain için çağrı tarafından belirtilen) korur ve daha sonra initWithFormat: çağrısının serbest olarak burada, sub-optimal kod üretiyor.

Eğer __unsafe_unretained mülkiyet niteleyici eklersek, aşağıdaki örnekte olduğu gibi, kodu en iyi şekilde işlenir. __unsafe_unretained kullanmak için derleyici ilkel (işaretçi kopyala) assignment semantics gösterir.

- (NSString *)hello:(__unsafe_unretained NSString *)name {
    return [[NSString alloc] initWithFormat:@"Hello, %@", name];
}

aşağıdaki gibi

"-[SGCAppDelegate hello:]":
    push    {r4, r7, lr}
    movw    r1, :lower16:(L_OBJC_SELECTOR_REFERENCES_2-(LPC1_0 4))
    add r7, sp, #4
    movt    r1, :upper16:(L_OBJC_SELECTOR_REFERENCES_2-(LPC1_0 4))
    movw    r0, :lower16:(L_OBJC_CLASSLIST_REFERENCES_$_-(LPC1_1 4))
    movt    r0, :upper16:(L_OBJC_CLASSLIST_REFERENCES_$_-(LPC1_1 4))
    add r1, pc
    add r0, pc
    mov r4, r2
    ldr r1, [r1]
    ldr r0, [r0]
    blx _objc_msgSend
    movw    r1, :lower16:(L_OBJC_SELECTOR_REFERENCES_4-(LPC1_2 4))
    mov r3, r4
    movt    r1, :upper16:(L_OBJC_SELECTOR_REFERENCES_4-(LPC1_2 4))
    add r1, pc
    ldr r1, [r1]
    movw    r2, :lower16:(L__unnamed_cfstring_-(LPC1_3 4))
    movt    r2, :upper16:(L__unnamed_cfstring_-(LPC1_3 4))
    add r2, pc
    blx _objc_msgSend
    .loc    1 31 1
    pop.w   {r4, r7, lr}
    b.w _objc_autorelease

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • hytchme

    hytchme

    9 Mart 2014
  • Lin Steven

    Lin Steven

    17 EKİM 2006
  • TotalxLuna

    TotalxLuna

    27 Kasım 2011