我有一个具有两个属性的类:
@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/