ios開發中類方法與self的注意點 與執行個體方法區別
Objective-C裡面既有執行個體方法也類方法。類方法(Class Method) 有時被稱為Factory 方法(Factory Method)或者方便方法(Convenience method)。Factory 方法的稱謂明顯和一般意義上的Factory 方法不同,從本質上來說,類方法可以獨立於對象而執行,所以在其他的語言裡面類方法有的時候被稱為靜態方法。
注意點一:類方法
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:唯讀