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)方法參數書寫要注意

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章