1. 程式人生 > >ios開發中類方法與例項方法區別 以及self有什麼不同

ios開發中類方法與例項方法區別 以及self有什麼不同

Objective-C裡面既有例項方法也類方法。類方法(Class Method) 有時被稱為工廠方法(Factory Method)或者方便方法(Convenience method)。工廠方法的稱謂明顯和一般意義上的工廠方法不同,從本質上來說,類方法可以獨立於物件而執行,所以在其他的語言裡面類方法有的時候被稱為靜態方法。
注意點一:類方法
1,類方法可以呼叫類方法。
2,類方法不可以呼叫例項方法,但是類方法可以通過建立物件來訪問例項方法。
3,類方法不可以使用例項變數。類方法可以使用self,因為self不是例項變數。
4,類方法作為訊息,可以被髮送到類或者物件裡面去(實際上,就是可以通過類或者物件呼叫類方法的意思)。
注意點二:self的規則
大家需要記住下面的規則:
1,例項方法裡面的self,是物件的首地址。
2,類方法裡面的self,是Class.
儘管在同一個類裡面的使用self,但是self卻有著不同的解讀。在類方法裡面的self,可以翻譯成class self;在例項方法裡面的self,應該被翻譯成為object self。在類方法裡面的self和例項方法裡面的self有著本質上的不同,儘管他們的名字都叫self。

類方法創造的物件要不要用release釋放?
答 不需要 這個物件被放到自動釋放池中

Object-C中的私有方法和私有成員變數

成員變數預設對內是共有的,對外是私有的。

@interface Controller : NSObject
{

@private: NSString *something;
}
+ (void)thisIsAStaticMethod;
- (void)thisIsAnInstanceMethod;
@end

@interface Controller (Private)
- (void)thisIsAPrivateMethod; 
@end

下面的程式碼就是怎樣獲取私有變數(記得加標頭檔案#import ):

NSString *str;
Mobj *obj = [[Mobj alloc] init];
object_getInstanceVariable(obj, "mt_", (void *)&str);
NSLog(@"%@",str);
[obj release];

//===================================

IOS例項方法和類方法的區別

類方法和例項方法  
1:例項方法是— 類開頭是+ 例項方法是用例項物件訪問,類方法的物件是類而不是例項,通常建立物件或者工具類。
在例項方法裡,根據繼承原理髮送訊息給self和super其實都是傳送給self
在類方法裡面self是其他的類的類方法,在類方法中給self傳送訊息只能發類方法self是類super也是
什麼時候用類方法,要建立一個例項時候獲取一個共享例項,或者獲取關於類的一些共有資訊
2:

類方法(class method)和例項方法(instance method)。類方法被限定在類範圍內,不能被類的例項呼叫(即脫離例項執行)。alloc就是一種類方法。例項方法限定在物件例項的範圍內(即例項化之前不能執行)。init就是一種例項方法,被alloc方法返回的物件例項呼叫。

NSObject * object1 = [[NSObject alloc] init];

instance method  以減號 "-" 開頭 
class method  以加號 “+” 開頭,相當於static方法 
3:see see 更健康

Objective-C

1.OC是一門基於C的面嚮物件語言,是C語言的一個超集,同時具有C語言的特徵

2.OC對類的定義和實現以及初始化

//宣告類介面,繼承NSObject物件(該物件是OC中所有類的頂級父類,所有類都繼承於它)

@interface ClassName :NSObject 

//成員屬性和成員函式的宣告

+(void)function;//類方法,不需要例項化物件就可以呼叫的方法

- (void)function2 :(NSString *)arg;//成員方法,必須通過例項化的物件呼叫

@end

//實現類

@imlementation ClassName

//成員屬性初始化和方法的定義

@end

物件的初始化:ClassName *obj = [[ClassName alloc] init]

OC中以訊息機制傳遞資訊,傳送alloc訊息給類分配記憶體空間,傳送init訊息生成物件,指標指向物件本身。

3.類方法的呼叫

[obj function];

NSString *str = [NSString stringWithString:@"hello"];

[obj function2 : str];

4.輸出函式

根據不同的輸出格式輸出不同的值 (%d :整形 ,%@:物件<傳送description訊息>,%s:字串)

NSlog(@“The result is %d”,intNum); 

CF代表Core Foundation (Cocoa)

CFShow傳送description給它顯示的物件,CFShow列印的資訊不會顯示時間戳,NSLog會顯示,同時CFShow不需要格式字元 串,它只能用於物件

CFShow(obj);

5.屬性

支援點表示法:myTableViewCell.textLabel.text = @"hello" 等價於 [[myTableViewCell textLabel] setText:@"hello"];

使用屬性生成器 property

在h檔案中宣告: @property int year

在m檔案中合成生成器:@synthesize year

使用 obj.year = 1999 相當於呼叫了 [obj setYear:1999];

可以自定義取值方法和賦值方法(getter and setter)

-(int)year

{

return year;

}

- (void) setYear : (int) newYear

{

//此處添加了一些基本的記憶體管理方法,保留新的值,釋放以前的值

if(newYear != year)

{

[year release];

year = [newYear retain];

}

}

也可以繞過oc的命名約定,自己指定getter和setter方法的名稱;

@property(getter = isExist,setter = setExist:) BOOL exist;

@synthesize exist;

使用過程中既可以使用新定義的方法名,也可以使用以前的方法(點表示法)

屬性的特性:readwrite readonly assign retain copy nonatomic 

assign:預設行為,使用@property int year就使用了assign行為,就是給例項變數賦了一個值

retain:實現了兩個功能,一個是保留了賦值時傳遞的物件,其次是賦值前釋放了以前值,使用retain可以實現上面討論的記憶體管理的優點,使用時加上 @property (retain)int year;

copy:傳送一條複製的訊息給被傳遞的物件,保留它,並釋放任何以前的值;

nonactomic:非原子訪問器,加上後可以提升訪問速度,但當兩個執行緒同時修改同一個屬性時就會出現問題,原子屬性可以保證屬性在被一個執行緒使用時不被另一個執行緒訪問,不存在atomic關鍵字,預設情況下,所有方法都是自動合成的。(類似與java中的執行緒鎖機制synchronized)

readwrite:可讀寫 

readonly:只讀