1. 属性(Property)
OC中,属性指提供了getter和(或)setter方法的数据。
@property int numerator; //setNumerator numerator
@property int denominator; //setDenominator denominator
本质上,属性是方法(不是变量),属性的值是由实例变量来保存。
1.1 属性的本质
属性一般由三个部分组成:
1)保存属性值的实例变量
{
实例变量类型 实例变量名
}
2)getter和setter方法的声明
getter方法的方法名和属性名一样,没有参数,返回值类型和属性类型一样。
-(属性的类型)属性名;
setter方法的方法名是"set" +属性名并首字母大写+":"+和属性类型一样的参数。
3)getter和setter方法的实现
setter方法的实现主要是用来给属性赋值的。
getter方法的实现主要是用来读取属性的值。
引用.属性 = 值; ==>会自动调用setter方法
变量 = 引用.属性; ==>会自动调用getter方法
1.2 声明式的属性
1)定义实例变量
2)在interface部分声明属性:
@property 属性类型 属性名;
3)在implementation部分生成具体的方法:
@synthesize 属性名 = 实例变量名;
会自动生成对应的setter和getter方法。
1.3 从iOS5开始,声明式的属性简化如下:
可以不定义实例变量,编译器会生成"_属性名"的实例变量,但在implementation部分,还必须生成具体的方法:
@synthesize 属性名 = _属性名;
1.4 从iOS6开始,声明式属性又简化:
只需要用@property声明属性即可,实例变量和getter,setter方法的具体实现会自动生成,不需要程序员干涉。
如果你不满意编译器生成的部分,可以自己写。
//
// Point2_1.h
// day02-4
// 属性的第1个版本
// Created by tarena on 14-3-18.
// Copyright (c) 2014年 tarena. All rights reserved.
//
#import <Foundation/Foundation.h>
@interface Point2_1 : NSObject
{
int x;
int y;
}
-(void)setX:(int)newX;
-(int)getX;
-(void)setY:(int)newY;
-(int)getY;
@end
//
// Point2_1.m
// day02-4
//
// Created by tarena on 14-3-18.
// Copyright (c) 2014年 tarena. All rights reserved.
//
#import "Point2_1.h"
@implementation Point2_1
-(void)setX:(int)newX{
x = newX;
}
-(int)getX{
return x;
}
-(void)setY:(int)newY{
y = newY;
}
-(int)getY{
return y;
}
@end
//
// Point2_2.h
// day02-4
// 属性的第2个版本
// Created by tarena on 14-3-18.
// Copyright (c) 2014年 tarena. All rights reserved.
//
#import <Foundation/Foundation.h>
@interface Point2_2 : NSObject
{
int _x;
int _y;
}
-(void)setX:(int)x;
-(int)getX;
-(void)setY:(int)y;
-(int)getY;
@end
//
// Point2_2.m
// day02-4
//
// Created by tarena on 14-3-18.
// Copyright (c) 2014年 tarena. All rights reserved.
//
#import "Point2_2.h"
@implementation Point2_2
-(void)setX:(int)x{
_x = x;
}
-(int)getX{
return _x;
}
-(void)setY:(int)y{
_y = y;
}
-(int)getY{
return _y;
}
@end
//
// Point2_3.h
// day02-4
// 属性的第3个版本
// Created by tarena on 14-3-18.
// Copyright (c) 2014年 tarena. All rights reserved.
//
#import <Foundation/Foundation.h>
@interface Point2_3 : NSObject
@property int x;
@property int y;
@end
//
// Point2_3.m
// day02-4
//
// Created by tarena on 14-3-18.
// Copyright (c) 2014年 tarena. All rights reserved.
//
#import "Point2_3.h"
@implementation Point2_3
@synthesize x = _x;
@synthesize y = _y;
@end
//
// Point2_4.h
// day02-4
// 属性的第4个版本
// Created by tarena on 14-3-18.
// Copyright (c) 2014年 tarena. All rights reserved.
//
#import <Foundation/Foundation.h>
@interface Point2_4 : NSObject
@property int x;
@property int y;
@end
//
// Point2_4.m
// day02-4
//
// Created by tarena on 14-3-18.
// Copyright (c) 2014年 tarena. All rights reserved.
//
#import "Point2_4.h"
@implementation Point2_4
@end
//
// main.m
// day02-4
//
// Created by tarena on 14-3-18.
// Copyright (c) 2014年 tarena. All rights reserved.
//
#import <Foundation/Foundation.h>
#import "Point2_1.h"
#import "Point2_2.h"
#import "Point2_3.h"
#import "Point2_4.h"
int main(int argc, const char * argv[])
{
@autoreleasepool {
Point2_1* p1 = [Point2_1 alloc];
[p1 setX:10];
[p1 setY:20];
NSLog(@"p1:(%d,%d)", [p1 getX], [p1 getY]);
Point2_2* p2 = [Point2_2 alloc];
[p2 setX:11];
[p2 setY:21];
NSLog(@"p2:(%d,%d)", [p2 getX], [p2 getY]);
Point2_3* p3 = [Point2_3 alloc];
p3.x = 31;
p3.y = 23;
NSLog(@"p3:(%d,%d)", p3.x, p3.y);
Point2_4* p4 = [Point2_4 alloc];
p4.x = 41;
p4.y = 14;
NSLog(@"p4:(%d,%d)", p4.x, p4.y);
}
return 0;
}