0

好的,我有课,我为我的核心数据创建

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;

但我还有一个问题。为什么我可以在我的代码中使用 then

 self.fromFirstClass

但我不能使用

 self.myEntity

Xcode 给我一个错误并说我应该使用

 self._myEntity

有什么区别?为什么我可以使用 self.fromFirstClass 而不是 self.myEntity?@结尾

4

3 回答 3

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- (void)setFromFirstClass:(FirstClass *)aFirstClass这将获取和设置实例变量。

如果你写@synthesize fromFirstClass = _fromFirstClass;,同样的事情会发生,除了创建的实例变量的名称前面有一个下划线。

最后,在较新版本的编译器中,如果您不编写任何内容,则默认行为是@synthesize fromFirstClass = _fromFirstClass自动为您执行。

于 2012-12-21T09:16:03.380 回答
2
@synthesize fromFirstClass = _fromFirstClass;
@synthesize myEntity = _myEntity;

上述这些行是正确的,但现在您不需要合成。@synthesize是编译器自己放的。

当您使用时,self.prop您的意思是您正在访问财产。

使用时_prop直接调用属性。

编辑:

使用时self.prop,根据 =(assignment) 的 lhs 或 rhs 调用该方法:

-(NSString *)prop; //gets called when you use myName=self.prop;

和/或

-(void)setProp; //gets called when you use self.prop=@"master";

另一方面,如果您尝试使用,self._myEntity那么它会查找不存在的方法名称_,从而导致错误。

于 2012-12-21T09:01:18.857 回答
1

编译器会添加

@synthesize myEntity = _myEntity;

如果你完全省略@synthesize

但是,您也可以使用

@synthesize myEntity;

关键区别在于,在第一种情况下,_myEntity当 getter 是 myEntity 而 setter 是 setMyEntity 时调用局部变量。因此,您可以从外部访问 yourObject.myEntity 以设置或获取值。编译器会注意调用 setter 和 getter。您不能直接访问该属性。 [yourObject.myEntity = value]ist 等同于[yourObject setMyEntity:value]以及value = yourObject.myEntity等同于value = [yourObject myEntity]

到目前为止,还没有从外部访问属性或其 getter 和 setter。从您的班级内部,您可能会认为这self.myEntity = valuemyEntity = value(对于第二种情况)相同。但事实并非如此。self.myEntity调用setter(或getter)。这对于 getter 尤其重要,因为它带有免费的重要内存管理 - 有或没有 ARC。WhilemyEntity = value直接访问该属性。

这就是 _ 及其关键优势(恕我直言)。如果您使用 _ 表示法,则调用该属性_myValue。这样做对于您和您的代码的读者来说,当直接访问实际属性以及何时使用 getter 和 setter 时,您和您的代码读者都非常清楚。

于 2012-12-21T10:07:08.630 回答