好的,我上课了,我为我的核心数据创建了
LoginPass.h
然后我有头等舱
FirstClass.h
然后我需要在SecondClass中使用这个类,我用@class声明它们。标题文件
SecondClass.h
...
@class FirstClass;
@class LoginPass;
...
@interface SecondClass : UIViewController
{
......
}
@property (strong, nonatomic) FirstClass *fromFirstClass;
@property (strong, nonatomic) LoginPass *myEntity;
...
@end
在.m文件中
#import "SecondClass.h"
#import "FirstClass.h"
#import "LoginPass.h"
@implementation SecondClass
...
@synthesize fromFirstClass = _fromFirstClass;
@synthesize myEntity = _myEntity;
...
好吧,我可以在代码中犯一些错误,为它而烦恼。 我真的不知道,现在不知道为什么我需要写
@synthesize myEntity = _myEntity;
但不是
@synthesize myEntity;
但我有另一个问题。为什么我可以在我的代码中使用
self.fromFirstClass
但我不能用
self.myEntity
Xcode给我一个错误并告诉我应该使用
self._myEntity
有什么区别?为什么我可以使用self.fromFirstClass但不能使用self.myEntity? @end
答案 0 :(得分:3)
您混淆实例变量是对象结构的变量部分,而属性实际上是方法来设置和获取值
当您声明@property (strong, nonatomic) FirstClass *fromFirstClass;
时,您实际上声明了两种方法- (FirstClass *)fromFirstClass
和- (void)setFromFirstClass:(FirstClass *)aFirstClass
。
当您使用点语法FirstClass *classA = self.fromFirstClass;
时,您实际上调用了一个方法,它等同于FirstClass *classA = [self fromFirstClass];
。同样,如果你写self.fromFirstClass = classB;
,你实际上会打电话:[self setFromFirstClass:classB];
。
如果直接在对象方法中使用实例变量的名称,则可以访问此变量。
现在,当你在现代运行时编写@synthesize fromFirstClass;
时,让编译器创建一个名为fromFirstClass
的实例变量,并编写两个方法- (FirstClass *)fromFirstClass
和{{1}将获取并设置实例变量。
如果你写- (void)setFromFirstClass:(FirstClass *)aFirstClass
,同样的事情发生了,除了创建的实例变量的名称前面有一个下划线。
最后,在最新版本的编译器中,如果你没有写任何东西,默认行为是@synthesize fromFirstClass = _fromFirstClass;
自动为你。
答案 1 :(得分:2)
@synthesize fromFirstClass = _fromFirstClass;
@synthesize myEntity = _myEntity;
以上这些行是正确的,但现在你不需要合成。@synthesize
由编译器本身提供。
当您使用self.prop
时,表示您正在访问财产。
当您使用_prop
时,您可以直接致电财产。
编辑:
使用self.prop
时,根据=(赋值)的lhs或rhs调用方法:
-(NSString *)prop; //gets called when you use myName=self.prop;
和/或
-(void)setProp; //gets called when you use self.prop=@"master";
另一方面,如果您尝试使用self._myEntity
,则会查找不存在_
的方法名称,从而导致错误。
答案 2 :(得分:1)
编译器会添加
@synthesize myEntity = _myEntity;
如果你完全省略@synthesize
。
但是,您也可以使用
@synthesize myEntity;
关键区别在于,在第一种情况下,您的局部变量称为_myEntity
,而getter是myEntity,而setter是setMyEntity。因此,从外部您可以访问yourObject.myEntity来设置或获取值。编译器会注意调用setter和getter。您不直接访问该属性。
[yourObject.myEntity = value]
与[yourObject setMyEntity:value]
相同,value = yourObject.myEntity
与value = [yourObject myEntity]
相同。
到目前为止,从外部访问属性或其getter和setter。从课堂内部开始,您可能认为self.myEntity = value
与myEntity = value
相同(第二种情况)。但事实并非如此。 self.myEntity
调用setter(或getter)。这对于getter来说非常重要,因为它可以免费提供重要的内存管理 - 无论是否有ARC。虽然myEntity = value
直接访问该属性。
这是_及其关键优势(imho)。如果使用_表示法,则该属性称为_myValue
。这样做,当直接访问实际属性以及使用getter和setter时,对于您和代码的读者来说,这显然是明确的。