属性就是为了简化代码量,由编译器自动写setter,getter方法。以前总不能理解weak,strong,retain,assign,现在明白了,编译器写的setter,getter方法不同。
person.h中的代码
//
// Person.h
// 8_10_属性
//
// Created by lanou3g on 15/8/10.
// Copyright (c) 2015年 lanou3g. All rights reserved.
//
#import <Foundation/Foundation.h>
@interface Person : NSObject
{
// NSString *_name;
// NSString *_gender;
// NSInteger _age;
// BOOL _death;
}
//声明属性(声明setter,getter方法),为了操作实例变量
/*
@property 属性类型 属性的名字
属性的类型 :必须跟操作的实例变量的类型相同,决定了setter方法的参数类型,getter方法的返回值类型。
属性的名字: 实例变量去掉下划线,决定了setter方法的名称及参数的名称,getter方法的名称
NSString *_name;
@property NSString *name;
与下面等效
-(void)setName:(NSString *)name;
-(NSString *)name;
*/
@property NSString *name;
@property NSString *gender;
@property NSInteger age;
@property BOOL death;
@end
Person.m中的代码
//
// Person.m
// 8_10_属性
//
// Created by lanou3g on 15/8/10.
// Copyright (c) 2015年 lanou3g. All rights reserved.
//
#import "Person.h"
@implementation Person
//属性的实现(实现setter,getter方法)\
/*
@synthesize 属性名 = 实例变量名;
等号右侧 :决定了编译器实现setter,getter方法时,方法内部使用的实例变量。
属性的实现是默认的,可以不写,所以下面是可以注释
*/
//@synthesize name = _name;
//@synthesize gender = _gender;
//@synthesize death = _death;
//@synthesize age = _age;
//@synthesize name;
//跟下面的一句是等价的;
//@synthesize name = name; //setter方法操作的实例变量是name;
-(void)introduce
{
NSLog(@"%@",_name);
}
@end
student.h中的代码
//
// Student.h
// 8_10_属性
//
// Created by lanou3g on 15/8/10.
// Copyright (c) 2015年 lanou3g. All rights reserved.
//
#import <Foundation/Foundation.h>
@interface Student : NSObject
{
@public
NSString *_name;
NSInteger _number;
float _score;
BOOL _death;
NSString *englishName;
@private
NSString *_gender;
}
/*
3、属性的特性
(1)读写特性
1)readwrite 默认。编译器声明setter和getter方法
2) readonly 只读。编译器只声明getter方法
3) setter 给编译器指定setter方法名。setter关键字基本不使用,不要修改编译器定义的setter方法名。
4)getter 给编译器指定getter方法名。getter仅在BOOL类型的属性中使用。
(2) 原子特性
1)atomic 原子性,默认的。 保证线程安全
2)nonatomic 非原子性 不保证线程安全
(3) 语义特性 影响setter方法的内部实现,跟内存有关。
1)assign 基本数据类型、对象类型,assign是默认的,一般只有基本类型才能用,特殊的只有一个,代理
2) retain 只能给对象类型
3) copy 只能给遵守<NSCopying>协议的对象类型使用
*/
//readwrite是默认的,与readonly时互斥的,不能同时存在
@property (nonatomic, readwrite,assign)NSString *name;
@property(setter=nn:,nonatomic) NSInteger number;
@property (nonatomic)float score;
//属性gender用readonly修饰,表示gender是一个只读的属性,编译器只提供getter方法。
@property (readonly,nonatomic,retain)NSString *gender;
@property (getter=isDeath,nonatomic)BOOL death;
@property(nonatomic,copy)NSString *englishName;
@end
student.m中的代码
//
// Student.m
// 8_10_属性
//
// Created by lanou3g on 15/8/10.
// Copyright (c) 2015年 lanou3g. All rights reserved.
//
#import "Student.h"
@implementation Student
//根据属性的设置,实现setter,getter方法。
//可以重写属性声明的setter,getter方法
//实现assign修饰的属性name的setter,getter方法
-(void)setName:(NSString *)name
{
_name = name;
}
-(NSString *)name
{
return _name;
}
//实现retain修饰的setter,getter方法
-(void)setGender:(NSString *)gender
{
if (_gender !=gender) {
[_gender release];
_gender = [gender retain];
}
}
-(NSString *)gender
{
//正确的写法如下,但效率低
// return [[_gender retain]autorelease];
return _gender;
}
//实现copy修饰的setter,getter方法
-(void)setEnglishName:(NSString *)englishName
{
if (_englishName!= englishName) {
[_englishName release];
_englishName = [englishName copy];
}
}
@end
最后再说一下@dynamic与@synthesize的区别。