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
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
Codesign döndü (ifile biçimi geçersiz ...
Twitter Bootstrap Duyarlı düzeni IE8 v...
Datetime bugün daha büyük veya eşit My...
Nasıl Eclipse 3.4 eklentileri kaldırma...
İki (veya daha fazla) C biri haline li...