gpt4 book ai didi

cocoa - 实现自定义访问器方法

转载 作者:行者123 更新时间:2023-12-03 17:12:53 26 4
gpt4 key购买 nike

我正在阅读《核心数据编程指南》。它包含以下文本:

You must, however, change attribute values in a KVC-compliant fashion. For example, the following typically represents a programming error:

NSMutableString *mutableString = [NSMutableString stringWithString:@"Stig"];
[newEmployee setFirstName:mutableString];
[mutableString setString:@"Laura"];

For mutable values, you should either transfer ownership of the value to Core Data, or implement custom accessor methods to always perform a copy. The previous example may not represent an error if the class representing the Employee entity declared the firstName property (copy) (or implemented a custom setFirstName: method that copied the new value). In this case, after the invocation of setString: (in the third code line) the value of firstName would then still be “Stig” and not “Laura”.

关于文本的问题:“在这种情况下”是哪种情况 - 属性被声明为“复制”还是不是?

关于复制和编程练习的问题:从我在这里读到的: NSString property: copy or retain?我明白了

  1. 使用副本将确保名字是“Stig”,而不是 Laura
  2. 这样做是明智的,因为“在几乎所有情况下,您都希望防止在背后改变对象的属性”

我真的很想知道上面引用的文本试图在核心数据的背景下告诉我们什么。无论如何,无论是否使用 Core Data,我们都必须使用“复制”。另外,如果有人能够对上面的“2”点(明智的做法是......)提供更多的说明,我会很高兴,因为在背后改变对象的属性会产生什么后果?

最佳答案

您的“关于文本的问题:“在这种情况下”是哪种情况 - 属性(property)被声明为“复制”还是不是?”我认为与苹果文档想要解释的观点不符。

正如Apple文档指出的,如果custom-accessor-method正常实现,默认实现复制属性值。如果属性值可能是可变的并且实现了 NSCopying 协议(protocol)(例如 NSString 的情况),您可以在自定义访问器中复制该值以帮助保留封装(例如,在实例NSMutableString 作为值传递)。

这是一个复制 setter 片段

@interface Department : NSManagedObject
{
}
@property(nonatomic, copy) NSString *name;
@end
@implementation Department
@dynamic name;
- (void)setName:(NSString *)newName
{
[self willChangeValueForKey:@"name"];
// NSString implements NSCopying, so copy the attribute value
NSString *newNameCopy = [newName copy];
[self setPrimitiveName:newNameCopy];
[self didChangeValueForKey:@"name"];
} @end

关于cocoa - 实现自定义访问器方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15978563/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com