@class @synthesize useablility

时间:2012-12-21 08:55:55

标签: iphone objective-c ios synthesize

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

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

3 个答案:

答案 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.myEntityvalue = [yourObject myEntity]相同。

到目前为止,从外部访问属性或其getter和setter。从课堂内部开始,您可能认为self.myEntity = valuemyEntity = value相同(第二种情况)。但事实并非如此。 self.myEntity调用setter(或getter)。这对于getter来说非常重要,因为它可以免费提供重要的内存管理 - 无论是否有ARC。虽然myEntity = value直接访问该属性。

这是_及其关键优势(imho)。如果使用_表示法,则该属性称为_myValue。这样做,当直接访问实际属性以及使用getter和setter时,对于您和代码的读者来说,这显然是明确的。