Object-C 学习笔记(七)---setter&getter

设置器(setter)&访问器(getter)
设置器(setter)和访问器(getter)提供了一个外界操作类内部属性的通道,但是在Object-C中,一般成员属性是私有(private)的,需要使用到设置器(setter)和访问器(getter),向外界暴露出接口.
   例子:
按照java C++ C#...的写法:
在.h文件里声明
//getter setter
-(void)setAge:(int)age;
-(int)getAge;


在.m文件里实现
-(void)setAge:(int)age
{
    _age = age;
}

-(int)getAge
{
    return _age;
}
但是Object-C中优化了设置器(setter)和访问器(getter),使用 @property @synthesize代替.
例子:
.h 文件
@property int heigh;
-(void)show;
.m 文件
@synthesize heigh = _heigh;//使用_heigh等同于使用heigh
-(void)show
{
    NSLog(@"%d",_heigh);
}
main函数调用
        student.heigh = 10;//直接使用
        NSLog(@"%d",student.heigh);
        [student show];

深入探究

@property (nonatomic,strong) NSString* temp;  
@property (readonly , copy) NSString *temp;
...
括号里
第一个参数表示设置只读或读写:

readwrite:表示既有getter,也有setter

readonly:表示只有getter,没有setter

nonatomic:非原子性操作,表示不考虑线程安全

atomic:原子性操作

第二个参数表示setter的权限:

strong:指定有很强的(拥有)关系到目标对象。

weak:指定有弱(non-owning)关系到目标对象。如果目的地对象销毁,属性值将自动设置为nil。(弱属性不支持OS X上的v10.6和iOS 4,使用指定取而代之)。

copy:调用原始对象的copy()方法,创建一个原始对象的副本,用于分配给新的引用。原始的对象在调用release方法。当然这个属性只用于实现了NSCopying协议的对象类型。

assign:指定使用简单的赋值的setter。这个属性是违约。  使用这个属性对于标量的类型(如NSInteger和CGRect等);

retain: 指定retain应该调用对象上的。原始的对象在调用release。在OS X v10.6和之后,您可以使用这个关键字用于内存管理方面


例子:
//属性声明
//引用型使用retain,基本数据类型使用:assign
//nonatomic 非原子性操作(引起线程安全问题);atomic 原子性操作
@property(retain,nonatomic)NSString *name;
@property(assign,nonatomic)NSInteger age;
@property(retain,nonatomic)NSString *school;

//使用属性定义,自动生成getter和setter
@synthesize name = _name;
@synthesize age = _age;
@synthesize school = _school;


注意:

使用retain修饰符在系统内部生成的如下:
//
//  People.h
//  Memory
//
//  Created by 5016 on 13-12-4.
//  Copyright (c) 2013年 dradon. All rights reserved.
//

#import <Foundation/Foundation.h>

@interface People : NSObject
{
    NSString* _address;
}

-(void)toString;
-(NSString*)getAddress;

@end
//
//  People.m
//  Memory
//
//  Created by 5016 on 13-12-4.
//  Copyright (c) 2013年 dradon. All rights reserved.
//

#import "People.h"

@implementation People


//@property(retain,nonatomic)NSString* address
//retain系统自动生成的使引用计数只加1
-(void)setAddress:(NSString*) address
{
    if (_address != address) {
        [_address release];
        _address = [address retain];

    }
     
}

-(NSString*)getAddress
{
    return _address;
}

@end




(1)在类(.h)中声明的方法都属于public方法,都可以通过对象调用,如果在类中没有声明,在.m文件里写,则该方法属于私有的,对象不能调用.
(2)使用@property 和 @synthesize 代替setter 和 getter用对象直接调用
 (3)方法参数书写要注意

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值