Object_c基础——getter、setter方法和@property、self关键字


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




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值