Objective c @interface声明和@property声明之间的区别

Objective c @interface声明和@property声明之间的区别,objective-c,iphone,properties,Objective C,Iphone,Properties,我不熟悉C,不熟悉objective C。对于iPhone子类,我在@interface类定义中声明了我希望对类中的所有方法可见的变量,例如 @interface myclass : UIImageView { int aVar; } 然后我再次声明 @property int aVar; 后来我 @synthesize aVar; 你能帮我理解三个步骤的目的吗?我在做一些不必要的事吗 谢谢。@interface在obj-c中声明类的实例变量。您需要它来创建一个实例变量。但是,默认

我不熟悉C,不熟悉objective C。对于iPhone子类,我在@interface类定义中声明了我希望对类中的所有方法可见的变量,例如

@interface myclass : UIImageView {
    int aVar;
}
然后我再次声明

@property int aVar;
后来我

@synthesize aVar;
你能帮我理解三个步骤的目的吗?我在做一些不必要的事吗


谢谢。

@interface在obj-c中声明类的实例变量。您需要它来创建一个实例变量。但是,默认情况下,该变量在类外不可见(因为该字段默认受保护)


@属性告诉编译器指定特定的属性访问器(get/set)方法。但是,您需要使用@synthesis让编译器自动生成简单访问器,否则您需要自己创建它们。

类可以有实例变量(IVAR)。它们在第一节中,仅对该类中的代码可见,而对任何外部代码都不可见。我喜欢在它们前面加一个下划线,以显示它们的内在特性。在低级术语中,IVAR作为一个附加成员添加到您正在创建的类内部使用的结构中

第二个声明@property是一个已声明的属性。它不是必需的(除非您使用@synthesis),但它可以帮助其他程序员(和编译器!)知道您正在处理一个属性,而不仅仅是两个方法
-setAVar
-aVar
,这是另一种方法

第三,@synthesis实际上创建了从类外部设置和访问属性的方法。您可以使用自己的setter和getter方法来替换它,但只有在需要时才这样做,因为内置方法具有一些特性,否则您必须自己编写代码。事实上,使用
@synthesis aVar=\u someVariable语法,您可以让您的属性实际引用不同名称的实例变量

简短版本:
@property只是给编译器和其他程序员一个提示,告诉他们您正在创建一个属性,而不仅仅是getter/setter方法。实例变量是类的内部变量,否则通常无法从外部访问。@synthesis只为您创建简单的getter和setter,以配合您的@property,但您也可以像其他任何方法一样,自己编写这些getter和setter。

这在您的对象中声明了一个实例变量:

@interface myclass : UIImageView {
    int aVar;
}
实例变量是类的私有实现细节

如果希望其他对象能够读取或设置实例变量(ivar)的值,可以将其声明为属性:

@property int aVar;
这意味着编译器希望看到属性的setter和getter访问器方法

当您使用@synthesis关键字时,您要求编译器自动为您生成setter和getter访问器方法

因此,在这种情况下,编译器将在遇到@synthesis关键字时生成与此类似的代码:

- (int) aVar
{
    return aVar;
}

- (void)setAVar:(int)someInt
{
    aVar = someInt;
}
默认情况下,在iPhone(以及Mac上的32位运行时)上,
@synthesis
需要存在一个实例变量才能存储属性值。此ivar的名称通常与属性的名称相同,但不必如此,例如,您可以执行以下操作:

@interface myclass : UIImageView {
    int aVar;
}

@property int someValue;

@synthesize someValue = aVar;
实际上既不需要
@synthesis
也不需要
@property
,您可以创建自己的getter和setter方法,只要使用符合键值编码的语法创建它们,该属性仍然可用

由于Mac和iPhone上32位Objective-C运行时的限制,需要提供ivar以及
@property
声明。Mac上的64位运行时不需要ivar,
@synthesis
会为您生成一个


请注意,您可以在
@属性
声明中使用许多关键字来控制创建何种类型的合成访问器代码,例如仅getter访问器的
只读
复制
原子
非原子
等。文档中有更多信息。

在这里,您要声明一个名为
aVar
的实例变量:

@interface myclass : UIImageView {
    int aVar;
}
// In header (.h) file

- (int)aVar;
- (void)setAVar:(int)newAVar;

// In implementation (.m) file

- (int)aVar {
    return aVar;
}

- (void)setAVar:(int)newAVar {
    if (aVar != newAVar) {
        aVar = newAVar;
    }
}
现在,您可以在类中使用此变量:

aVar = 42;
NSLog(@"The Answer is %i.", aVar);
但是,实例变量在Objective-C中是私有的。如果您需要其他类来访问和/或更改
aVar
,该怎么办?因为方法在Objective-C中是公共的,所以答案是编写一个访问器(getter)方法返回
aVar
,以及一个设置
aVar
的mutator(setter)方法:

@interface myclass : UIImageView {
    int aVar;
}
// In header (.h) file

- (int)aVar;
- (void)setAVar:(int)newAVar;

// In implementation (.m) file

- (int)aVar {
    return aVar;
}

- (void)setAVar:(int)newAVar {
    if (aVar != newAVar) {
        aVar = newAVar;
    }
}
现在,其他类可以通过以下方式获取和设置
aVar

[myclass aVar];
[myclass setAVar:24];
编写这些访问器和变异器方法可能会变得相当乏味,因此在Objective-C2.0中,苹果为我们简化了它。我们现在可以写:

// In header (.h) file

@property (nonatomic, assign) int aVar;

// In implementation (.m) file

@synthesize aVar;
…访问器/变异器方法将自动为我们生成

总而言之:

  • int-aVar声明一个实例变量
    aVar

  • @属性(非原子,赋值)int-aVar
    aVar

  • @aVar
    aVar


我最近开始学习iphone应用程序。据我所知,@property在.h文件中用作setter方法,@synthesis在.m文件中用作getter方法。在Java中,我们使用setter和getter方法,与Java相同,在Objective C中,我们使用@property和@Synthesis


如果您认为我误导了您,请原谅。

第一个是使Objective-C与C兼容。第二个是声明属性。第三个是,您可以将属性的定义与特定的转换单元相关联。欢迎来到C。谢谢-为什么我需要setter和getter方法(assumin
Class A      

      @interface myclass : UIImageView {
    int aVar;
}

If you declare like this then you can only use this variable within your class A.


But suppose in Class B

    A *object=[A new];
object.aVar---->not available



For this you should **declare aVar as a property in Class A**

so class A should look like 

Class A      

  @interface myclass : UIImageView {
    int aVar;
}
@property int iVar;


and 


.m file 
@synthesize iVar;



So now you can use this iVar in another class Suppose B


 Class B
#import "Class A.h"

    enter code here

A *object=[A new];
object.aVar---->available
means
object.aVar=10;