1. @property
1.1 在@inteface中使用
1.2 用来自动生成setter和getter的声明和实现(从Xcode 4.x后,之前的版本setter和getter的实习需要用到关键字@synthesize,这里不再阐述)
1.3 默认情况下,setter和getter方法中的实现,会去访问下划线 _ 开头的成员变量
1.4 用@property int height;就可以代替下面的两行
- (int)height // getter
{
return _height;
}
- (void)setHeight:(int)height; // setter
{
_height = height;
}
注意:
1. 如果成员变量age不存在,就会自动生成一个@private的成员变量age
2. 若手动实现了setter方法,编译器就只会自动生成getter方法
3. 若手动实现了getter方法,编译器就只会自动生成setter方法
4. 若同时手动实现了setter和getter方法,编译器就不会自动生成不存在的成员变量
2. self关键字
简单来理解,self,谁调用,就是谁。
访问成员变量:self->成员变量名
调用方法:[self 方法名
使用注意事项:
1.只能在OC方法中使用,不能出现在函数里。
2.不能用self调用函数。
3. 点语法
其实点语法的本质还是方法调用,当使用点语法时,编译器会自动展开成相应的方法
点语法若有复制操作则展开成setter方法,若无赋值操作则展开成getter方法。
例如:
Person *person = [[Person alloc] init]; // 创建一个Person对象
person.age = 19; // 设置年龄
person.name = @"David"; // 设置姓名
/*
person.age = 19;
等价于
[person setAge:19];
person.name = @"David";
等价于
[person setName:@"David"];
*/
注意死循环问题:
- (void) setAge:(int)age {
// 下面的代码的点语法进行赋值操作,展开成setter方法,会引发死循环
self.age = age;
}
- (int)age {
// 下面的代码未进行赋值操作,展开成getter方法,会引发死循环
return self.age;
}
具体演示代码如下:
main.m
#import <Foundation/Foundation.h>
#import "Car.h"
#import "Person.h"
int main()
{
Person *person = [[Person alloc] init]; // 创建一个Person对象
person.age = 19; // 设置年龄
person.name = @"David"; // 设置姓名
Car *car = [[Car alloc] init]; // 创建一个Car对象
car.price = 120000; // 设置车的价格
car.speed = 50; // 设置车的速度
person.car = car;
[person startCar];
return 0;
}
Person.h
#import <Foundation/Foundation.h>
#import "Car.h"
@interface Person : NSObject
@property NSString *name; // 姓名
@property int age; // 年龄
@property (nonatomic, retain) Car *car; // 拥有的车
- (void)startCar;//开车的行为
@end
Person.m
#import "Person.h"
@implementation Person
- (void)startCar
{
[self.car runWithSpeed:self]; // 谁调用self就是谁,此处对象方法中调用这是Person对象,所以self是Person的一个实例对象。
}
@end
Car.h
#import <Foundation/Foundation.h>
@class Person;
@interface Car : NSObject
@property int speed; // 时速
@property int price; // 价格
@property(nonatomic,assign) Person *person; // 车的拥有者
- (void)runWithSpeed:(Person *)person; // 车跑的行为
@end
Car.m
#import "Car.h"
#import "Person.h"
@implementation Car
- (void)runWithSpeed:(Person *)person
{
NSLog(@"%i岁的%@开着价值%i的车以每小时%i的公路速度去玩耍了!",person.age,person.name,person.car.price,person.car.speed);
}
@end