属性

属性就是为了简化代码量,由编译器自动写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的区别。
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值