Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 可以从getter返回属性的副本吗?_Objective C_Memory Management_Properties - Fatal编程技术网

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;