gpt4 book ai didi

ios - 没有@synthesizing 的@property 声明

转载 作者:行者123 更新时间:2023-11-28 18:07:09 25 4
gpt4 key购买 nike

我正在关注 Joe Conway 的 Big Nerd Ranch iOS Programming,当我看到以下代码时有点困惑。

WebViewController.h

#import <Foundation/Foundation.h>
@interface WebViewController : UIViewController
@property (nonatomic, readonly) UIWebView *webView;
@end

WebViewController.m

#import "WebViewController.h"

@implementation WebViewController
- (void)loadView
{
// Create an instance of UIWebView as large as the screen
// Tell web view to scale web content to fit within bounds of webview
}

- (UIWebView *)webView
{
return (UIWebView *)[self view];
}
@end

不应该综合 .h 文件中声明的属性吗? Xcode 也没有发出警告(当我声明一个带有合成的属性时通常会发出警告)。

顺便说一句,在书中,他还提到

In WebViewController.h, add a property (but not an instance variable)

声明一个属性不会自动为你生成一个实例变量吗?让我知道我错过了什么。谢谢。

最佳答案

这是一个很好的问题,我认为这个问题的答案有点微妙,而且对于刚开始使用 Objective-C 的人来说通常不是立竿见影的。首先,让我们消除关于属性的神话。神话是这样的:

Objective-C 属性与实例变量相关

这不一定是真的。这经常是正确的,但并非在所有情况下都是正确的。这是真的:

一个 Objective-C 属性声明了一个 getter 和一个 setter 方法

(或者在 readonly 属性的情况下,只是一个 getter)。特别是当你声明一个名为 foo 的属性时(为了便于讨论,我们假设它不是只读的),你真正做的唯一一件事就是告诉编译器你正在编写的类有一个一个名为 -foo 的方法和一个名为 -setFoo: 的方法。通过将 @synthesize foo; 声明添加到 .m 文件中,您告诉编译器自己生成这些方法。在这里你说,“编译器,创建一个实例变量(也称为 foo)并为我的 -foosetFoo: 方法生成实现访问此实例变量。特别是,在 -foo 中返回此变量的值,并在 -setFoo: 中设置变量的值。

请注意,没有必要让编译器为您合成这些方法。相反,您可以自己编写 -foo-setFoo:。此外,您不需要以任何方式创建实例变量来支持这些方法的实现。您可以随意编写它们。

总结一下:@property 只告诉编译器 getter 和 setter 方法的存在。然后您可以:@synthesize .m 中的方法或自己编写方法。

关于ios - 没有@synthesizing 的@property 声明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10990328/

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