Objective c 可以从getter返回属性的副本吗?
我有以下简单的课程:Objective c 可以从getter返回属性的副本吗?,objective-c,memory-management,properties,Objective C,Memory Management,Properties,我有以下简单的课程: @interface Article: NSObject { NSString *title; } @property (copy, nonatomic) NSString *title; @end @implementation - (void)setTitle:(NSString *)aString { if ((!title && !aString) || (title && aString && [
@interface Article: NSObject {
NSString *title;
}
@property (copy, nonatomic) NSString *title;
@end
@implementation
- (void)setTitle:(NSString *)aString {
if ((!title && !aString) || (title && aString && [title isEqualToString:aString])) return;
dirty = YES;
[title release];
title = [aString copy];
}
- (NSString *)title {
return title;
}
@end
在我的应用程序中,我必须做很多事情,比如
我知道我拿到房产后应该给retain打电话:
NSString *title=[article.title retain];
也许我懒得在我得到的地方做保留。或者如果我需要在整个应用程序中执行数十次
我能让getter退一份吗
- (NSString *)title {
return [title copy];
}
最好返回可变属性的副本,这样其他对象就不能从您的下方更改您的对象
对于普通NSString,由于它是不可变的,
copy
和retain
都执行相同的操作-它们保留字符串并返回它。出于安全原因,在某些情况下,我更愿意返回属性的副本。例如,如果我正在编写一个具有唯一标识符属性的类,那么我将“返回[[u uniqueID copy]autorelease]”,这样其他类就不可能对唯一标识符执行任何操作。其他时候,我只返回对象本身,因为如果它是外部操纵的,这并不是什么大问题
另外,对于这些getter方法,它们不应该返回带有+1 retain计数的对象(这就是您要做的)。如果有的话,他们应该直接返回对象,或者返回+0保留计数(retain/copy+autorelease)。这样做可以大大简化内存管理。如果外部对象需要保留返回的对象,那么外部对象应该负责保留它需要的任何内容。在Chuck的注释中,您经常会看到(NSMutableString*)属性返回对象的副本,而不是对原始字符串的引用。正如他指出的,这是一种安全机制,允许您在访问字符串时处理该字符串的“快照” 但是,在您的特定示例中,似乎title属性设置了一次,然后被访问以用作UILabel中的文本 如果这是您唯一的应用程序,那么从技术上讲,从访问器获取NSString时不必保留它
NSString * articleTitle = article.title;
label.text = articleTitle;
articleTitle = nil;
当设置字符串的“文本”属性时,UILabel将存储该字符串的保留副本。您可以在设置文本后“nil”引用,您将得到相同的结果。不涉及额外的保留/释放。(尽管这可能是一种好的做法)我不同意,最好返回一个不可变的引用(尤其是在图书馆中),因此只有需要变异的客户才需要支付复制成本。在某些情况下,总是复制的开销可能是禁止的。@mseed:我不确定你所说的“不可变引用”是什么意思。我认为Objective-C没有这样的结构。正如我所说,如果值已经是不可变的,那么就没有“复制成本”,这是一种浪费。
NSString * articleTitle = article.title;
label.text = articleTitle;
articleTitle = nil;