一、点语法
1)根据以前学的,调用方法是这样的
Student *stu = [Student new];
[stu setAge:100];
int age = [stu age];
如果用点语法,这样就可以调用了
stu.age = 100;
int age = stu.age;
2)点语法的本质
其实点语法的本质还是方法调用,当使用点语法时,编译器会自动展开成相应的方法。
3)在xcode项目创建一个class类,叫person。在person.h中申明
#import <Foundation/Foundation.h>
@interface Person : NSObject
{
int _age;
NSString *_name;
}
// 年龄的getter和setter
- (void)setAge:(int)age;
- (int)age;
- (void)setName:(NSString *)name;
- (NSString *)name;
@end
在person.m中实现类的功能
#import "Person.h"
@implementation Person
- (void)setAge:(int)age
{
_age = age;
}
- (int)age
{
return _age;
}
#pragma mark - 姓名的seter和getter
#pragma mark 姓名的set方法
- (void)setName:(NSString *)name
{
_name = name;
}
#pragma mark 姓名的get方法
- (NSString *)name
{
return _name;
}
@end
在main.m中
#import <Foundation/Foundation.h>
#import "Person.h"
int main(int argc, const char * argv[])
{
Person *p = [Person new];
p.name=@"sfjk";
p.age=10;
int a = p.age;
点击运行按钮运行结果
4)注意死循环
- (void) setAge:(int)age {
self.age = age;
}
- (int) age {
return self.age;
}
这两个方法都将会引发死循环。
二、 @property和@synthesize
1)@property用在@inteface中用来自动生成setter和getter的声明。例如:
用@property int age;就可以代替下面的两行
- (int)age;
- (void)setAge:(int)age;
@synthesize
用在@implementation中,用来自动生成setter和getter的实现。
- (int)age{
return _age;
}
- (void)setAge:(int)age{
_age = age;
}
2)注意细节:
1. @synthesize age = _age;setter和getter实现中会访问成员变量_age ,如果成员变量_age不存在,就会自动生成一个@private的成员变量_age。
2. 若手动实现了setter方法,编译器就只会自动生成getter方法,若手动实现了getter方法,编译器就只会自动生成setter方法,若同时手动实现了setter和getter方法,编译器就不会自动生成不存在的成员变量。
3. @propert的新特性
自从Xcode 4.x后,@property就独揽了@synthesize的功能。也就是说,@property可以同时生成setter和getter的声明和实现
默认情况下,setter和getter方法中的实现,会去访问下划线 _ 开头的成员变量.
4)实例运行
创建person.h文件
#import <Foundation/Foundation.h>
@interface Person : NSObject
//{
// int _age;
//}
@property int age;
@end
person.m文件
#import "Person.h"
@implementation Person
@end
在main.m中
#import "Person.h"
int main(int argc, const char * argv[]) {
Person *p = [Person new ];
[p setAge:10];
int a =[p age];
NSLog(@"Hello, World\n%d",a );
return 0;
}
运行结果
可以看出要想懒得动手,一个@property就搞定了。
补充一句,如果是用@property申明的属性,而且没有指明属性的作用域,那么这个属性默认是protect属性的。
好了,今天就学到这里了