objective-c的属性:一般来说就是描述信息中的名词,动词的话一般就是方法。
setter方法:
getter方法:
访问方法,取值方法
@property ,@synthesize自动生成setter和getter;
点语法:
stu.age=-200 等价于 [stu setAge:-200];
声明文件 .h
@property 声明文件上对应的是setter设置和getter取值方法,
@property NSString*hello;
设置方法对应的:-(void) setHello:(NSString*) h;
取值方法对应的:-(NSString*) hello;
实现文件 .m
@synthesize 实现文件上设置方法和取值方法的实现;
@synthesize hello =_hello;
设置了实例变量名 (默认和属性名一致)
属性对的是方法,不是变量。
(1)、@property
功能:让编译器自动编写一个与数据成员同名的方法声明来省去读写方法的声明。
访问控制;线程安全;内存控制等功能。
用法:
声明@property的语法为:@property(参数1,参数2)类型 名字;
@property(assign,nonatomic,setter=setAge:) int age;
@property(retain,nonatomic)
@synthesize
功能:通知编译器自动为我们创建setter和getter方法,我们无需创建它们,我们只需要使用它们。
用法:
@synthesize 变量名;
@synthesize
如果你在@property设置了属性,如果你使用@synthesize ,那么它会自动帮你完成这些属性的实现,如果你是自己手动的去完成实现的话,那么,你必须自己写出这些属性的实现。
(2)、setter 和 getter方法:
任何一种面向对象的语言,都有setter和getter器这个概念,C++,java等,因为setter和getter是对面向对象语言封装的最基本的支持。
如:{ int age;
}
-(void) setAge:( int ) newAge;
-( int ) age;
在OC中,getter的方法名少了get,因为get...在Objective-C有别的用处,所以getter器直接写的就是变量名。
readwrite: 表示既有getter ,也有setter;
readonly: 表示只有getter,没有setter;
这两个属性是互相排斥的,只能存在一个。
下面的属性指定setter语义设置访问器。他们是互相排斥的。
strong: 指定有很强的(拥有)关系到目标对象。
weak; 指定有弱(non-owning)关系到目标对象。如果目的地对象销毁,属性值将自动设置为nil。
copy: 调用原始对象的copy()方法,创建一个原始对象的副本,用于分配给新的引用。原始的对象在调用release方法。当然这个属性只用于实现了NSCopying协议的对象类型。
assign: 指定使用简单的赋值的setter、这个属性是违约的。使用这个属性对于标量的类型(如NSInteger和CGRect等);
retain: 指定retain应该调用对象上的。原始的对象在调用release。
(3)、点语法:
好处:
1、方便程序员能够很快的转到O-C上来;
2、让程序设计简单化;
3、隐藏了内存管理细节;
4、隐藏了多线程、同步、加锁细节;
5、点语法的使用。
Dog *dog=[[Dog alloc]init];
[dog setAge:100];
int dogAge=[dog age];
NSLog(@"Dog Age is %d",dogAge);
下面的代码用点语法
dog.age=200;//调用setAge方法
dogAge=dog.age;//调用age方法;
这里的点不是调用的dog这个对象的字段,而是在调用方法,dog.age是在调用setAge这个方法,下面的dog.age是在调用age这个方法。
(4)、self
self 是类的隐藏的参数,指向当前调用方法的类,另一个隐藏参数是_cmd, 代表当前类方法的selector。这里只关注这个self。super 并不是隐藏参数,它只是一个“编译器指示符”,它和self指向的是相同的消息接收者,不论是用[ self setName] 还是[super setName],接收“setName”这个消息的接收者都是同一个对象。不同的是,super告诉编译器,当调用setName的方法时,要去调用父类的方法,而不是本类里的。
当使用self调用方法时,会从当前类的方法列表中开始找,如果没有,就从父类中再找;而当使用super时,则从父类的方法列表中开始找,然后调用父类的这个方法。