我有一个具有两个属性的类:

@interface Contact : NSObject {
    NSString *lastname;
    NSString *lastNameUpper;
}


我已将姓氏声明为属性(并在.m文件中对其进行了合成):

@property (nonatomic, retain) NSString *lastname;


但是,我想编写自己的方法来访问lastNameUpper,所以我声明了一个方法:

- (NSString *) lastNameUpper;


并像这样实现它:

- (NSString *) lastNameUpper {
    if (!lastNameUpper) {
        lastNameUpper = [lastname uppercaseString];
    }
    return lastNameUpper;
}


可以正常工作,但是由于经常调用它,因此会调用许多临时对象。有趣的是,Instruments显示了很多“ Malloc(4k)”,并且每次访问lastNameUpper时,数字都会增加。我还可以看到在objc_retailAutoreleaseReturnValue中分配了内存。

由于在将项目转换为ARC之前一切正常,所以我假设我必须对方法签名进行一些ARC特定的添加,但似乎无法使其工作。

有什么建议么?

最佳答案

覆盖- (void)setLastname:(NSString*)aLastname方法(由@synthesize lastname自动创建),并像现有方法一样设置lastNameUpper。

现在创建一个lastNameUpper属性(并对其进行合成):

@property (nonatomic, readonly) NSString *lastNameUpper;


由于这将返回lastNameUpper实例变量的指针,因此每当访问该变量时都不应进行任何复制。

关于objective-c - 在ARC下返回NSString时如何避免临时对象,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10249633/

10-09 20:35