轉(zhuǎn)自:?jiǎn)尉€程 : http://www.reibang.com/p/139d60452283
原著作者 : https://www.2cto.com/kf/201412/361299.html
Objective-C里面既有實(shí)例方法也類方法蔗包。類方法(Class Method) 有時(shí)被稱為工廠方法(Factory Method)或者方便方法(Convenience method)。工廠方法的稱謂明顯和一般意義上的工廠方法不同逛薇,從本質(zhì)上來說,類方法可以獨(dú)立于對(duì)象而執(zhí)行嗤形,所以在其他的語言里面類方法有的時(shí)候被稱為靜態(tài)方法卸奉。
注意點(diǎn)一:類方法
1,類方法可以調(diào)用類方法隘截。
2嗅虏,類方法不可以調(diào)用實(shí)例方法洛姑,但是類方法可以通過創(chuàng)建對(duì)象來訪問實(shí)例方法。
3皮服,類方法不可以使用實(shí)例變量楞艾。類方法可以使用self参咙,因?yàn)閟elf不是實(shí)例變量。
4硫眯,類方法作為消息蕴侧,可以被發(fā)送到類或者對(duì)象里面去(實(shí)際上,就是可以通過類或者對(duì)象調(diào)用類方法的意思)两入。
注意點(diǎn)二:self的規(guī)則大家需要記住下面的規(guī)則:
1净宵,實(shí)例方法里面的self,是對(duì)象的首地址谆刨。
2,類方法里面的self归斤,是Class.
盡管在同一個(gè)類里面的使用self痊夭,但是self卻有著不同的解讀。在類方法里面的self脏里,可以翻譯成class self她我;在實(shí)例方法里面的self,應(yīng)該被翻譯成為object self迫横。在類方法里面的self和實(shí)例方法里面的self有著本質(zhì)上的不同番舆,盡管他們的名字都叫self。
類方法創(chuàng)造的對(duì)象要不要用release釋放矾踱?
答: 不需要 這個(gè)對(duì)象被放到自動(dòng)釋放池中
Object-C中的私有方法和私有成員變量
成員變量默認(rèn)對(duì)內(nèi)是共有的恨狈,對(duì)外是私有的。
@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實(shí)例方法和類方法的區(qū)別
類方法和實(shí)例方法
實(shí)例方法是- 類開頭是+ 實(shí)例方法是用實(shí)例對(duì)象訪問呛讲,類方法的對(duì)象是類而不是實(shí)例禾怠,通常創(chuàng)建對(duì)象或者工具類。
在實(shí)例方法里贝搁,根據(jù)繼承原理發(fā)送消息給self和super其實(shí)都是發(fā)送給self
在類方法里面self是其他的類的類方法吗氏,在類方法中給self發(fā)送消息只能發(fā)類方法self是類super也是什么時(shí)候用類方法,要?jiǎng)?chuàng)建一個(gè)實(shí)例時(shí)候獲取一個(gè)共享實(shí)例雷逆,或者獲取關(guān)于類的一些共有信息
類方法(class method)和實(shí)例方法(instance method)弦讽。類方法被限定在類范圍內(nèi),不能被類的實(shí)例調(diào)用(即脫離實(shí)例運(yùn)行)膀哲。alloc就是一種類方法往产。實(shí)例方法限定在對(duì)象實(shí)例的范圍內(nèi)(即實(shí)例化之前不能運(yùn)行)。init就是一種實(shí)例方法某宪,被alloc方法返回的對(duì)象實(shí)例調(diào)用捂齐。
instance method 以減號(hào) "-" 開頭
class method 以加號(hào) “+” 開頭,相當(dāng)于static方法
see see 更健康
Objective-C
1.OC是一門基于C的面向?qū)ο笳Z言缩抡,是C語言的一個(gè)超集奠宜,同時(shí)具有C語言的特征
2.OC對(duì)類的定義和實(shí)現(xiàn)以及初始化
//聲明類接口包颁,繼承NSObject對(duì)象(該對(duì)象是OC中所有類的頂級(jí)父類,所有類都繼承于它)
@interface ClassName :NSObject
//成員屬性和成員函數(shù)的聲明
+(void)function压真;//類方法娩嚼,不需要實(shí)例化對(duì)象就可以調(diào)用的方法
- (void)function2 :(NSString *)arg;//成員方法滴肿,必須通過實(shí)例化的對(duì)象調(diào)用
@end
//實(shí)現(xiàn)類
@imlementation ClassName
//成員屬性初始化和方法的定義
@end
對(duì)象的初始化:ClassName *obj = [[ClassName alloc] init]
OC中以消息機(jī)制傳遞信息岳悟,發(fā)送alloc消息給類分配內(nèi)存空間,發(fā)送init消息生成對(duì)象泼差,指針指向?qū)ο蟊旧怼?br> 3.類方法的調(diào)用
[obj function]贵少;
NSString *str = [NSString stringWithString:@"hello"];
[obj function2 : str];
4.輸出函數(shù)
根據(jù)不同的輸出格式輸出不同的值 (%d :整形 ,%@:對(duì)象<發(fā)送description消息>堆缘,%s:字符串)
NSlog(@“The result is %d”,intNum);
CF代表Core Foundation (Cocoa)
CFShow發(fā)送description給它顯示的對(duì)象滔灶,CFShow打印的信息不會(huì)顯示時(shí)間戳,NSLog會(huì)顯示吼肥,同時(shí)CFShow不需要格式字符 串录平,它只能用于對(duì)象
CFShow(obj);
5.屬性
支持點(diǎn)表示法:myTableViewCell.textLabel.text = @"hello"等價(jià)于[[myTableViewCell textLabel] setText:@"hello"];
使用屬性生成器 property
在h文件中聲明: @property int year
在m文件中合成生成器:@synthesize year
使用 obj.year = 1999 相當(dāng)于調(diào)用了 [obj setYear:1999];
可以自定義取值方法和賦值方法(getter and setter)
-(int)year
{
return year;
}
- (void) setYear : (int) newYear
{
//此處添加了一些基本的內(nèi)存管理方法,保留新的值缀皱,釋放以前的值
if(newYear != year)
{
[year release];
year = [newYear retain];
}
}
也可以繞過oc的命名約定斗这,自己指定getter和setter方法的名稱;
@property(getter = isExist,setter = setExist:) BOOL exist;
@synthesize exist;
使用過程中既可以使用新定義的方法名啤斗,也可以使用以前的方法(點(diǎn)表示法)
屬性的特性:readwrite readonly assign retain copy nonatomic
assign:默認(rèn)行為表箭,使用@property int year就使用了assign行為,就是給實(shí)例變量賦了一個(gè)值
retain:實(shí)現(xiàn)了兩個(gè)功能钮莲,一個(gè)是保留了賦值時(shí)傳遞的對(duì)象燃逻,其次是賦值前釋放了以前值,使用retain可以實(shí)現(xiàn)上面討論的內(nèi)存管理的優(yōu)點(diǎn)臂痕,使用時(shí)加上 @property (retain)int year伯襟;
copy:發(fā)送一條復(fù)制的消息給被傳遞的對(duì)象,保留它握童,并釋放任何以前的值姆怪;
nonactomic:非原子訪問器,加上后可以提升訪問速度澡绩,但當(dāng)兩個(gè)線程同時(shí)修改同一個(gè)屬性時(shí)就會(huì)出現(xiàn)問題稽揭,原子屬性可以保證屬性在被一個(gè)線程使用時(shí)不被另一個(gè)線程訪問,不存在atomic關(guān)鍵字肥卡,默認(rèn)情況下溪掀,所有方法都是自動(dòng)合成的。(類似與java中的線程鎖機(jī)制synchronized)
readwrite:可讀寫
readonly:只讀