下面关于属性和成员变量的描述只是针对OC的类(分类和类稍有不同)。
属性是有setter和getter方法的,并且会默认生成带下划线的成员变量。如果只是在{}中声明了成员变量,是不会有属性的,也不会生成setter和getter方法。
属性
@interface Device : NSObject
@property (nonatomic , strong) NSString *deviceID;
@end
如上所示我们通过property
定义的deviceID
就是属性。
成员变量(实例变量)
1.默认生成_deviceID成员变量
如上所示定义deviceID
的属性后,编译器会自动生成一个带下划线的成员变量_deviceID
。我们可以通过self.deviceID
访问属性,通过_deviceID
访问成员变量(两种方式访问的结果是一样的)。
#import "Device.h"
@implementation Device
- (void)function1{
self.deviceID = @"124"; // 属性
_deviceID = @"124"; // 成员变量
}
@end
2.通过@synthesize来生成成员变量
2.1 @synthesize deviceID
在.m文件的@implementation
中加入代码@synthesize deviceID;
后,编译器会自动生成setter/getter方法,并且此时的成员变量是deviceID
而不是_deviceID
。
@implementation Device
@synthesize deviceID;
- (void)function1{
self.deviceID = @"124"; // 属性
deviceID = @"124"; // 成员变量
}
@end
2.2 @synthesize deviceID = dID
如果改成@synthesize deviceID = dID;
,此时的成员变量就变成了dID
。
@implementation Device
@synthesize deviceID = dID;
- (void)function1{
self.deviceID = @"124"; // 属性
dID = @"124"; // 成员变量
}
@end
3.自己定义成员变量
可以在.h或.m文件的{}中定义成员变量。如果前面的@public
修饰不写的话就是默认的@protected
。
// .h文件中定义成员变量
@interface Device : NSObject
{
@public NSString *deviceType;
}
@end
// .m文件中定义成员变量
@implementation Device
{
NSString *deviceState;
}
@end
网友评论