使用allocautorelease个初始值设定项是否更好(更快、更高效).例如.:

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

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

我知道在大多数情况下,这里的表现并不重要.但是,我还是想养成做得更好的习惯.

如果它们做完全相同的事情,那么我更喜欢后一个选项,因为它的输入时间更短,可读性更强.

在Xcode 4.2中,有没有一种方法可以查看ARC编译到什么位置,即它将retainreleaseautorelease等放在哪里?切换到ARC时,此功能非常有用.我知道你不应该go 想这些东西,但它会帮我找到这些问题的答案.

推荐答案

差别很小,但你应该 Select autorelease个版本.首先,你的代码更具可读性.第二,在判断优化的装配输出时,autorelease版稍微更为优化.

autorelease版,

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

翻译成

"-[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}

而[[alloc]init]版本如下所示:

"-[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

正如预期的那样,它会稍微长一点,因为它正在调用allocinitWithFormat:方法.特别有趣的是,ARC在这里生成了次优代码,因为它保留了name字符串(通过调用_objc_retain来说明),然后在调用initWithFormat:之后释放.

如果我们添加__unsafe_unretained所有权限定符,如下面的示例所示,代码将以最佳方式呈现.__unsafe_unretained指示编译器使用原语(复制指针)assignment semantics.

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

详情如下:

"-[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

Objective-c相关问答推荐

如何获取 NSDictionary 中的第一个元素?

等到多个网络请求都执行完毕 - 包括它们的完成块

如何用零填充左侧的整数?

iphone keys 串项目在应用程序卸载后仍然存在?

核心数据独特属性

如何在for (id item in items)objective-c 循环中获取数组索引?

iphone 的 UIPopoverController 不工作?

在 Objective C 中动态调用类方法

为什么 UICollectionView 的 UICollectionViewCell 没有在用户时突出显示?

在 iOS8 上,以横向模式显示我的应用程序会隐藏状态栏,但在 iOS 7 上,状态栏会同时显示在两个方向上

NSTimeInterval 格式

XCTAssert 和 XCTAssertTrue 有什么区别?

更改 UIDatePicker 字体 colored颜色 ?

从 Unix 时间戳创建 NSDate

反编译 Objective-C 库

Objective-C 中的 const 与静态 NSStrings

用于 iOS 开发的 LLVM 与 GCC

Objective-c 2.0 中的可选参数?

UIImageView 并不总是为模板图像着色

如何检测父视图控制器中模态视图控制器的解除?