我不明白在代码中声明实例变量的方法
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 会自动为 属性 合成名称为 _name
的 ivar。该实例变量就是您在 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 声明时更改此默认行为。
我不太明白声明实例变量的方式和属性。有人可以详细解释下面两个代码的区别吗?在第二种方法中,如果我将_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 会自动为 属性 合成名称为 _name
的 ivar。该实例变量就是您在 init
.
您实际上可以使用 @synthesize name = _myName
更改 ivar 的名称,或者根本没有它(如果您手动声明 getter 和 setter,则不会合成 ivar) .
Objective-C 属性是一个相当复杂的话题,所以如果您不能立即理解它,请不要担心。
属性 是 public 这意味着其他 classes 可以读取和写入它们(即使 classes 不是 sub声明 属性 的 class 的 classes。除此之外,属性还提供了一个 getter 和一个 setter 方法(mutator 方法)。每次访问 属性
时都会调用 属性 的 getterNSString *aName = self.name;
而每次您写入或分配到属性时都会访问setter。
self.name = @"Some name";
默认情况下,实例变量(或 ivars)仅对声明它的 class 及其子classes(也称为被他们的 class) 封装了。不过,您可以在将关键字 @public 添加到 ivar 声明时更改此默认行为。