关闭

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

标签: settergetterpropertysynthesize
529人阅读 评论(0) 收藏 举报
分类:
设置器(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
0

猜你在找
【直播】机器学习&数据挖掘7周实训--韦玮
【套餐】系统集成项目管理工程师顺利通关--徐朋
【直播】3小时掌握Docker最佳实战-徐西宁
【套餐】机器学习系列套餐(算法+实战)--唐宇迪
【直播】计算机视觉原理及实战--屈教授
【套餐】微信订阅号+服务号Java版 v2.0--翟东平
【直播】机器学习之矩阵--黄博士
【套餐】微信订阅号+服务号Java版 v2.0--翟东平
【直播】机器学习之凸优化--马博士
【套餐】Javascript 设计模式实战--曾亮
查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场