ios - 在自定义 getter 和 setter 方法时使用@property

标签 ios objective-c iphone

在自定义getter和setter方法时,似乎没有必要使用@property。像这样。

@property (nonatomic) Person *spouse;
@property (nonatomic, copy) NSString *lastName;
@property (nonatomic, copy) NSString *lastNameOfSpouse;

如果我像这样使用自定义 getter 和 setter

- (void)setlastNameOfSpouse:(NSString *)name {
    self.spouse.lastName = name;
}
- (NSString *)lastNameOfSpouse {
    return self.spouse.lastName;
}

@property 似乎不会合成任何getter 或setter 方法。

我想知道在这个例子中是否还需要使用@property以及@property中使用的属性是否生效。

最佳答案

在这种情况下,您绝对应该仍然使用属性。

所以考虑这一行:

@property (nonatomic, copy) NSString *lastNameOfSpouse;

这是 API 的声明。如果您没有将它包含在您的接口(interface)中,那么其他类将无法轻松访问该属性。它还 promise ,此类的对象将以某种方式响应 -lastNameOfSpouse-setLastNameOfSpouse:。有很多不同的方式可以兑现 promise 。一种常见的方法是使用编译器生成的方法。另一种方法是自己实现这些方法。另一种方法是在运行时添加方法实现。另一种方法是使用消息调度系统。有很多选择。您使用的选项与界面无关。

在我们拥有属性之前,我们必须在接口(interface)中手动声明这两个方法:

@interface Person
- (NSString *)lastNameOfSpouse;
- (void)setlastNameOfSpouse:(NSString *)name;
@end

然后您必须手动编写每个实现。这有点乏味(乏味到 entire tool 的存在纯粹是为了给你写这些)。 ObjC2 通过将其称为“属性”并允许在单行中声明它(以及一些有关预期如何实现这些方法的提示)来简化此模式。根据请求 (@synthesize),编译器将为您创建最常见的实现。后来的编译器创新会为您未能自行实现的任何属性自动创建实现。这让事情变得更好了。但这只是包装 API promise 的编译器细节。这就是您将其包含在界面中的原因。

关于ios - 在自定义 getter 和 setter 方法时使用@property,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31517618/

相关文章:

ios - CoreData refreshAllObjects() 不会刷新所有对象

android - 无法在 iOS 中点击 Admob 横幅广告

ios - 在 Swift 3 中更改 UITextField 中的文本时调用 Web 服务

iphone - MKMapView userLocation 在 iOS5 上错误但在 iOS4.2 上正确

iphone - 如何将文件从 S3 下载到 iPhone 应用程序?

objective-c - 叠加 PDF 页面

ios - 在 Swift 中读取 UIApplicationLaunchOptionsURLKey

ios - objective-c 如何获取私有(private)方法列表

iOS 使用别人的 .p12 和 .mobileprovision 发布 IPA

iphone - 显示系统警报 "No Mail Accounts"