一、学习属性我们首先要对属性有一个清晰地认识,什么是属性?属性和我们熟知的实例变量有用什么区别呢??
实例变量和属性是一个包含关系,实例变量中包含属性,而属性是作为实例变量的子集
这种情况是需要为您举例子的,比如 汽车 是一个类(一个集合)
1.您指出了一辆特定的车(请注意,这里是指的单个的一辆车),那么这辆车属于 汽车 这个类,这辆车您就可以理解为是汽车这个类的实例变量(指出了一个例子,实例也可以叫做 对象 )
2.而您可以看到这辆车的颜色、车轮、发动机等等的车身上的部件,我们就可以称这些部件为 属性。
3.而汽车是如何发动的,如何跑的,关于这些 我们可以称作它们是这辆车的方法,当然所有的车都可以发动,都可以跑,所以这些方法也是属于汽车的这个类(集合的)
如果用程序的角度编写的话,比如您设置了一个父类是NSObject的自定义类,就叫做Car
那么这个Car中,您可以通过在头文件用@property或者大括号‘{}‘直接声明一些变量,比如颜色、厂家等等,这些用@property或者大括号声明的变量称作Car这个类的属性
而您进入主程序,设置一个Car类的变量,并声明了一个内存空间给它
Car * instanceCar = [[Car alloc]init];
那么这个"instanceCar"就是一个 实例对象(也是一个变量),这个变量是属于Car这个类的,所以这个变量可以使用Car类中所有的属性,也就是说,您可以用instanceCar.某属性的方法直接为这些变量赋值,而赋值后instanceCar这个变量就是一个独一无二的变量,是一个已经具体化的汽车的例子,所以称作实例对象(变量).
二、了解了什么是属性后,我们要学习为什么用属性?属性有什么作用?
我们通过声明属性(@property)来摆脱繁琐的setter和getter方法的创建。@property声明与实现文件中的另一个声明@sythesize相结合,来完成setter和getter方法的创建。@property生成设置器和访问器方法的声明,@synthesize 生成设置器和访问器方法的实现。
注意:只有当访问器不存在的时候, @synthesize才会自动生成访问器,所以,即使是使用 @synthesize声明了一个属性,你仍然可以实现自定义的getter和setter。
属性是设置实例变量的方法,也是获取实例变量的方法。
三、属性注意事项:
1、当属性名和成员变量名一样时,如果我们想保证成员变量有值,那么就需要在.m中加入@synthesize 变量名
2、当属性名和成员变量名一样时,如果我们对成员变量的值不强求,但我们又想打印赋上的值,这时在.m里可以使用_属性名 或者 self.属性名
3、当定义一个属性时,会首先查找是否有以_属性名命名的成员变量,如果有,则默认对其进行set和get,如果没有,则隐式生成以_属性名命名的变量
4、当我们使用属性时,成员变量可以省略
程序如下:
#import <Foundation/Foundation.h>
#import "Person.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
Person *p = [[Person alloc] init];
p.name = @"王三";//默认调用name的set方法
NSLog(@"==%@",p.name);//默认调用get方法
[p sayHi];
}
return 0;
}
1、当属性名和成员变量名一样时,如果我们想保证成员变量有值,那么就需要在.m中加入@synthesize 变量名
#import <Foundation/Foundation.h>
@interface Person : NSObject{
NSString *name;//对应注意1
}
//属性的关键字,属性帮我们封装了set和get方法
@property (nonatomic, strong) NSString *name;
@property (nonatomic, assign) int a;
-(void)sayHi;
@end
#import "Person.h"
@implementation Person
//@synthesize name;
-(void)sayHi{
NSLog(@"我是%@",name);
}
@end
//2、当属性名和成员变量名一样时,如果我们对成员变量的值不强求,但我们又想打印赋上的值,这时在.m里可以使用_属性名 或者 self.属性名
#import <Foundation/Foundation.h>
@interface Person2 : NSObject{
NSString *name;
}
@property NSString *name;
-(void)sayHi;
@end
#import "Person2.h"
@implementation Person2
-(void)sayHi{
NSLog(@"--%@",_name);
NSLog(@"--%@",self.name);
}
@end
//3、当定义一个属性时,会首先查找是否有以_属性名命名的成员变量,如果有,则默认对其进行set和get,如果没有,则隐式生成以_属性名命名的变量
#import <Foundation/Foundation.h>
@interface Person3 : NSObject{
NSString *_nam8e;
}
@property NSString *name;
-(void)sayHi;
@end
#import "Person3.h"
@implementation Person3
-(void)sayHi{
NSLog(@"--%@",_name);
NSLog(@"--%@",self.name);
}
@end
//4、当我们使用属性时,成员变量可以省略
#import <Foundation/Foundation.h>
@interface Person4 : NSObject
@property NSString *name;
-(void)sayHi;
@end
#import "Person4.h"
@implementation Person4
-(void)sayHi{
NSLog(@"--%@",_name);
NSLog(@"--%@",self.name);
}
@end