自訂類。 在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方法。