Iphone Don';不需要在接口中放置属性吗?

Iphone Don';不需要在接口中放置属性吗?,iphone,objective-c,Iphone,Objective C,我想我得到了一本关于Objective-C的糟糕的书。书中说,把我要使用的变量放在接口括号内,让其他类可以使用,然后声明同一事物的属性 @interface appDelegate : NSObject <UIApplicationDelegate> { NSNumber *myNumberOtherClassesCanUse; } @property (nonatomic, retain) NSNumber *myNumberOtherClassesCanUse; @接

我想我得到了一本关于Objective-C的糟糕的书。书中说,把我要使用的变量放在接口括号内,让其他类可以使用,然后声明同一事物的属性

@interface appDelegate : NSObject <UIApplicationDelegate>  {
    NSNumber *myNumberOtherClassesCanUse;
}
@property (nonatomic, retain) NSNumber *myNumberOtherClassesCanUse;
@接口appDelegate:NSObject{
NSNumber*MyNumberTherClasseScan使用;
}
@属性(非原子,保留)NSNumber*MyNumberTotherClassScanUse;
然而,我看到另一个问题得到了回答,这让我觉得我不必把它们放在括号内,所以我尝试了一下,它仍然可以正常工作


我买了另一本书,它也没有解释它,所以有人能告诉我或者告诉我什么时候我必须把它们放在括号里并使它们成为属性吗?

相信你的编译器,而不是你的书。

相信你的编译器,不是您的书籍。

当您使用
@property
@synthesis
时,通常不必将它们放在
@接口
括号中,因为如果synthesis没有检测到类中声明的支持ivar,它将为您创建变量

《卓越的iOS配方》一书指出,iOS设备运行时一直具有此功能,但它只是在iOS 4中添加到模拟器中。因此,考虑到模拟器在开发中被大量使用,它可能只是一种长期存在的习惯

为了支持Objective-C编程语言

有一个关键区别:现代运行时支持实例变量合成,而传统运行时不支持


当您使用
@property
@synthesis
时,通常不必将它们放在
@interface
括号中,因为如果synthesis没有检测到类中声明的支持ivar,它将为您创建变量

《卓越的iOS配方》一书指出,iOS设备运行时一直具有此功能,但它只是在iOS 4中添加到模拟器中。因此,考虑到模拟器在开发中被大量使用,它可能只是一种长期存在的习惯

为了支持Objective-C编程语言

有一个关键区别:现代运行时支持实例变量合成,而传统运行时不支持


一个冗长而复杂的答案:

类字段、接口括号内的内容:

@interface MyClass : SomeSuperclass
{
  int someNumber_; /* this stuff */
}
向对象添加实际字节。一个objective-C类实际上,在所有的绒毛之下,只是一个大型的C结构;这些是该结构的字段。(您甚至可以使用
->
风格的C指针语法来获取这些字段,尽管如果您在其中没有
@public
的情况下这样做,编译器会对您大喊大叫;访问这些字段的正确方法是像任何其他变量一样使用裸名称。)

财产声明,如:

@property (nonatomic, assign, readwrite) int someNumber;
obj-C 2.0是一对方法声明的缩写,如:

-(int)someNumber;
-(void)setSomeNumber:(int)newNumber;
这对你的课堂毫无帮助;它只是向世界宣布,这里有一些可以在这个类上执行的操作。按照惯例,像这样的方法应该获取并设置一个字段值,或者至少表现得像这样。使用这样的方法可以使用
obj.prop
obj.prop=val
dot语法调用它们

综合指令:

@synthesize someNumber;
(可选)在运行时使用标准内置行为(由“非原子,分配”填充通知)为您创建这些方法,可以选择创建一个同名字段来获取和设置。类似于
@synthesis-someNumber=someNumber将创建的字段命名为“someNumber\uUx”。如果您在@interface块中声明了这样一个字段,就像我在上面所做的那样,它将使用该字段;否则,它会悄悄地插入自己的适当字段。这种静场插入是自4.x模拟器以来的新行为;在此之前,您必须声明@interface{}块中的所有字段,句号

总之:@interface{…}描述对象的物理字段@属性()。。。描述对象的使用方式;@synthesis是实现基本getter/setter和插入额外字段(如果需要)的缩写。我通常让@synthesis完成它的工作,并将@interface{}块留空,直到我真正需要显式声明一个字段,通常是用调试器查看它


[在最新的SDK中,上面的一些已经过时。特别是,@synthesis现在是可选的,可以在.m文件的
@实现中声明实例变量。]

一个冗长而复杂的答案:

类字段、接口括号内的内容:

@interface MyClass : SomeSuperclass
{
  int someNumber_; /* this stuff */
}
向对象添加实际字节。一个objective-C类实际上,在所有的绒毛之下,只是一个大型的C结构;这些是该结构的字段。(您甚至可以使用
->
风格的C指针语法来获取这些字段,尽管如果您在其中没有
@public
的情况下这样做,编译器会对您大喊大叫;访问这些字段的正确方法是像任何其他变量一样使用裸名称。)

财产声明,如:

@property (nonatomic, assign, readwrite) int someNumber;
obj-C 2.0是一对方法声明的缩写,如:

-(int)someNumber;
-(void)setSomeNumber:(int)newNumber;
这对你的课堂毫无帮助;它只是向世界宣布,这里有一些可以在这个类上执行的操作。按照惯例,像这样的方法应该获取并设置一个字段值,或者至少表现得像这样。使用这样的方法可以使用
obj.prop
obj.prop=val
dot语法调用它们

综合指令:

@synthesize someNumber;
(可选)在运行时使用标准内置行为(由“非原子,分配”填充通知)为您创建这些方法,可以选择创建一个同名字段来获取和设置。类似于
@synthesis-someNumber=someNumber命名cr