Objective-C速成(二)

來源:互聯網
上載者:User
自訂類。        在Object-c上,一個類由一個公開的標頭檔.h和一個私人的實現檔案.m,標頭檔定義了類的介面,從@interface開始,到@end結束 如下:#import <Foundation/Foundation.h>
@interface Member:NSObject    //類名為Member ,繼承了NSObject
{
//執行個體變數
NSString *name;        //會員姓名
Int points;            //會員購買的積分點
}
//方法聲明
-(NSString *)name;                //獲得會員姓名資訊
-(void)setName:(NSString *)value;        //設定會員姓名
-(int) points:                //獲得積分資訊
-(void)setPoints:(int)points;        //設定會員積分
-(BOOL)hasPoint:        //判斷該會員是否還有積分
-(void)buyCourse:(int) courseID; //會員購買課程
@end        在實現檔案中,我們主要實現兩類功能:一類是get/set方法,另一類是具體操作,如購買課程。實現檔案首先需要import標頭檔,然後@implementation類,程式如下。主要講述實現程式文法格式,super,self等知識點。#import "Member.h"
@implmentation Member
-(id)init{            //初始化方法,可有可無,根據實際需要來提供,父類中定義。
    if(self = [super init]){    //調用父類中的初始化方法:self類似與Java中的this
    
        name =@"無名";
        points = 0;
    }
    return self;
}

-(int)points{        //get方法,返回屬性值

    return points
}

-(void)setPoints:(int)value{//set方法,設定屬性值
    points = value;

-(NSString *)name{    //返回姓名

    return name;

}

-(void)setName:(NSString *)newName{    //設定姓名

    if(name != newName){    //如果是兩個不同對象
        [name release];    //釋放舊對象
        
        name = [newName copy];        //獲得新對象,obj-c使用引用傳遞,而不是值傳遞
        // name的應用計數為1
    
    }
}

-(BOOL) hasPoints{    //還有積分嗎?

    return ([self points]>0);        //self類似java中的this,

}

-(void)buyCourse:(int)courseId{    //購買課程

    if([self hasPoints]){
        ...
    }else{
        NSLog(@"需要購買積分");
    }
}

-(void)dealloc{
    [name release];        //釋放name所佔用的記憶體
    [super dealloc];//使用super調用父類中的dealloc
}
@end需要做出幾點說明如下:一個灰可以定義多個init方法,如:-(id)init;
-(id)initWithName:(NSString *)name;
-(id)initWithName:(NSString *)name points:(int)points;如果有多個init方法的話,一般的方法調用具體方法,比如:-(id) init{
    Return [self initWithName:@”NO Name”]
}
-(id)initWithName:(NSString *)name{
    Return [self initWithName:name  points:0];
}如果你給某些變數申請了記憶體,那麼你需要在dealloc方法中釋放,但是並不直接調用dealloc來釋放,而是用release.在應用程式中,你調用自己的類來完成一些操作Member *member = nil;
//alloc分配記憶體,如果你調用了alloc,那麼你必須考慮釋放
member = [[Member alloc] init];        //init用於設定初始值
[member setName:@"king"];
[member setPoints:50];
[member buyCourse:18];
[member release];//使用release來釋放對象所佔用的記憶體內在管理:同C有一點類似,Objective-C需要使用alloc方法來申請記憶體。不同的是,C直接調用free函數來釋放記憶體,而Objective-C並不直接調用dealloc來釋放。整個Objective-C都使用對象引用,而且每個對象有一個引用計數器。當計數器為0時,系統調用dealloc來釋放內在。Objective-C提供了autorelease屬性,從而你可以讓系統自動釋放對象所佔有的記憶體。當使用alloc(或者copy) 方法建立一個對象時,其計數器的值為1,調用retain方法就增加1,調用release就減少1。當計數器為0時,系統自動調用dealloc方法來釋放記憶體中的對象:如Member *member = [[Member alloc] init]    ;//執行後,計數器為1[member retain];    //執行後計數器為2
[member release];    //執行後,計數器對象為1
[member release];    //執行後計數器為0,系統自動調用dealloc方法
//在釋放之後,如果調用對象的任何一個方法,應用都會異常中止。
為了防止異常中止的問題。可以在最後一個release之後添加一句:
member = nil;
將對象設定為nil。在這之後,任何調用該member的方法都返回nil,而不是異常中止:
分析:
-(void) setName:(NSString *)newName{
    
    if(name != newName){
        [name  release];
        name = [newName copy];        //name的引用計數器為1
    }
}4.5.2自動釋放池(autorelease)如果你在代碼中建立了一個字串,如果你需要返回這個字串的話,那麼你需要使用autorelease(自動釋放),而不是release;-(NSString *)welcome{
    
    NSString *result;
    result = [[NSString alloc] initWithFormat:@"歡迎%@登入",name];
    //[result release];        //不能釋放,否則調用者無法擷取新字串資訊。
    [result autorelease];//使用autorelease.
    return result;
}通過autorelease,該對象被放入自動釋放池,系統自動跟蹤每個對象的使用方式,並存釋放自動釋放池時釋放池中的所有對象,autorelease不是系統的垃圾收集功能。在IPhone作業系統上obj-c垃圾收集功能。下面幾個是記憶體管理的基本原則:1.如果你使用alloc(或者copy)方法建立一個對象時,或者使用retain保留一個對象,那麼你要自己釋放。2.在大多數情況下,申請記憶體的語句數量和釋放記憶體的語句數量應該相等3.盡量少使用記憶體。4.6從概念上講,obj-c類同java/C++類相似。你需要指定類名,屬性和方法。ojb-c提供了@Property和@synthesize標誌,其功能是標識類中的屬性,並讓系統自動產生set/get方法執行個體在Member.h中
-(NSString *)name;        //擷取會員姓名資訊
-(void)setName:(NSString *)value;        //設定會員姓名
-(void)points:        //擷取積分資訊
-(void)setPoints:(int)points;    //設定會員積分下面改用@property來標誌:@property (copy) NSString *name;//設定copy(釋放舊對象,拷貝新對象)@property (int) points;在Member.m中 我們原來編寫了如下代碼:-(int)points{        //get方法,返回屬性值

    return points
}

-(void)setPoints:(int)value{//set方法,設定屬性值
    points = value;

-(NSString *)name{    //返回姓名

    return name;

}

-(void)setName:(NSString *)newName{    //設定姓名

    if(name != newName){    //如果是兩個不同對象
        [name release];    //釋放舊對象
        
        name = [newName copy];        //獲得新對象,obj-c使用引用傳遞,而不是值傳遞
        // name的應用計數為1
    
    }
}現在可以改為@synthesize points;@synthesize name;在上面語句中@sythesize自動產生了get/set方法。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.