Ios @不带@synthesis的属性声明

Ios @不带@synthesis的属性声明,ios,properties,synthesize,Ios,Properties,Synthesize,我正在关注Joe Conway的Big Nerd Ranch iOS编程,当我看到下面的代码时,我有点困惑 WebViewController.h #import <Foundation/Foundation.h> @interface WebViewController : UIViewController @property (nonatomic, readonly) UIWebView *webView; @end 不应该合成.h文件中声明的属性吗?Xcode也没有给出警告(

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

WebViewController.h

#import <Foundation/Foundation.h>
@interface WebViewController : UIViewController
@property (nonatomic, readonly) UIWebView *webView;
@end
不应该合成.h文件中声明的属性吗?Xcode也没有给出警告(当我用synthesis声明属性时通常会这样做)

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

在WebViewController.h中,添加属性(但不是实例变量)

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

这是因为“
webView
”getter方法是在.m文件中实现的,因此,“
@synthesis
”是不必要的

如果没有在代码中明确创建“
webView
”方法,那么编译器会抱怨没有合成属性。在本例中,合成一个“只读”属性只会创建一个“getter”方法,该方法的作用与您在上面的代码中看到的大致相同

是的,根据,它说的是关于“
@synthesis
”:

使用@synthesis指令告诉编译器,如果需要,它应该为属性合成setter和/或getter方法 您不在@implementation块中提供它们最新版本 @synthesis指令还合成适当的实例 变量(如果未另行声明)。


这是一个很好的问题,我认为这个问题的答案有点微妙,而且对于刚开始使用Objective-C的人来说,往往不是即时的。首先,让我们消除一个关于财产的神话。神话是这样的:

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

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

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

(或者在
只读属性的情况下,只是一个getter)。特别是当您声明一个名为
foo
的属性时(为了讨论,我们假设它不是只读的),您真正要做的唯一一件事就是告诉编译器您正在编写的类有一个名为
-foo
的方法和一个名为
-setFoo:
的方法。通过添加一个
@synthesis foofoo
),并为访问此实例变量的my
-foo
setFoo:
方法生成实现。特别是,在
-foo
中返回此变量的值,并在
-setFoo:
中设置变量的值

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


总而言之,
@属性只告诉编译器getter和setter方法的存在。然后您可以:
@合成.m中的方法或自己编写方法。

我明白了!非常感谢您的帮助!不敢相信我错过了getter。最新版本的XCode自动合成为什么设置/获取属性在没有合成的情况下仍然有效?
#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