我不明白在代码中声明实例变量的方法

I do not understand ways of declaring instance variable in the code

我不太明白声明实例变量的方式和属性。有人可以详细解释下面两个代码的区别吗?在第二种方法中,如果我将_name用于instance variable,它是否与第一个代码中声明name的方式相同?谢谢!

第一个代码:

//  OrderItem.h
#import <Foundation/Foundation.h>

@interface OrderItem : NSObject

{

  @public NSString *name;

}

-(id) initWithItemName: (NSString *) itemName;

@end


//  OrderItem.m
#import "OrderItem.h"

@implementation OrderItem

-(id) initWithItemName: (NSString *) itemName {

     self = [super init];

      if (self) {

          name = itemName;

         NSLog(@"Initializing OrderItem");
   }

     return  self;

   }

@end

第二个代码:

//  OrderItem.h
#import <Foundation/Foundation.h>

@interface OrderItem : NSObject

 @property (strong,nonatomic) NSString *name;

-(id) initWithItemName: (NSString *) itemName;

@end


//  OrderItem.m
#import "OrderItem.h"

@implementation OrderItem

-(id) initWithItemName: (NSString *) itemName {

     self = [super init];

      if (self) {

          _name = itemName;

         NSLog(@"Initializing OrderItem");
   }

     return  self;

   }

@end

在第一种情况下,您声明了一个实例变量(在 Objective-C 中通常称为 ivar)。

在第二种情况下,您声明了 属性。 属性 是一组两个方法,一个 getter 和一个 setter,通常使用点符号访问,例如self.name。但是,ivar 会自动为 属性 合成名称为 _nameivar。该实例变量就是您在 init.

中访问的内容

您实际上可以使用 @synthesize name = _myName 更改 ivar 的名称,或者根本没有它(如果您手动声明 getter 和 setter,则不会合成 ivar) .

Objective-C 属性是一个相当复杂的话题,所以如果您不能立即理解它,请不要担心。

属性 是 public 这意味着其他 classes 可以读取和写入它们(即使 classes 不是 sub声明 属性 的 class 的 classes。除此之外,属性还提供了一个 getter 和一个 setter 方法(mutator 方法)。每次访问 属性

时都会调用 属性 的 getter
NSString *aName = self.name;

而每次您写入或分配到属性时都会访问setter。

self.name = @"Some name";
默认情况下,

实例变量(或 ivars)仅对声明它的 class 及其子classes(也称为被他们的 class) 封装了。不过,您可以在将关键字 @public 添加到 ivar 声明时更改此默认行为。