詳解Objective_C擴(kuò)展機(jī)制學(xué)習(xí)
Objective_C擴(kuò)展機(jī)制學(xué)習(xí)是本文要介紹的內(nèi)容,學(xué)Objective_C已有一年時(shí)間了,開(kāi)發(fā)iphone也有一年時(shí)間了。首先學(xué)習(xí)Objective_C的時(shí)候,是賃著c/c++的基礎(chǔ),所學(xué)的知識(shí)是按c/c++的方式去學(xué)習(xí),其實(shí)Objective_C是 C 的超集當(dāng)時(shí)一點(diǎn)也沒(méi)體會(huì)到,其精髓也是完全沒(méi)有理解到。隨關(guān)時(shí)間的推移,慢慢了解更多。
Objective_C比c/c++更強(qiáng)大,因?yàn)樗艘恍┰O(shè)計(jì)模式在里面。聽(tīng)說(shuō)java里幾乎包括了所有的設(shè)計(jì)模式,不過(guò)我沒(méi)有深入用過(guò)java,曾經(jīng)用過(guò)j2me寫(xiě)過(guò)一點(diǎn)點(diǎn)邏輯。用Objective_C最靈活的兩 點(diǎn)就是:category與associative. 我把他們歸為Objective_C的擴(kuò)展機(jī)制。category可以擴(kuò)展一個(gè)類(lèi)的方法,associative可以擴(kuò)展一個(gè)類(lèi)的屬性。 這兩種方法加起來(lái)其功能完全等效于c++中的繼承。
下面看一個(gè)associative的列子,需要的頭文件是:
- #import <objc/runtime.h>
- static char overviewKey = 'a';
- NSArray *array = [[NSArray alloc] initWithObjects:@ "One", @"Two", @"Three", nil];
- // For the purposes of illustration, use initWithFormat: to ensure
- // we get a deallocatable string
- NSString *overview = [[NSString alloc] initWithFormat:@"%@", @"First three numbers"];
- objc_setAssociatedObject ( array, &overviewKey, overview, OBJC_ASSOCIATION_RETAIN);
- [overview release];
- NSString *associatedObject = (NSString *) objc_getAssociatedObject (array, &overviewKey);
- NSLog(@"associatedObject: %@", associatedObject);
- objc_setAssociatedObject ( array, &overviewKey, nil, OBJC_ASSOCIATION_ASSIGN );
- [array release];
- static char overviewKey = 'a';
- NSArray *array = [[NSArray alloc] initWithObjects:@ "One", @"Two", @"Three", nil];
- // For the purposes of illustration, use initWithFormat: to ensure
- // we get a deallocatable string
- NSString *overview = [[NSString alloc] initWithFormat:@"%@", @"First three numbers"];
- objc_setAssociatedObject ( array, &overviewKey, overview, OBJC_ASSOCIATION_RETAIN);
- [overview release];
- NSString *associatedObject = (NSString *) objc_getAssociatedObject (array, &overviewKey);
- NSLog(@"associatedObject: %@", associatedObject);
- objc_setAssociatedObject ( array, &overviewKey, nil, OBJC_ASSOCIATION_ASSIGN );
- [array release];
objc_setAssociatedObject給array增加了一個(gè)屬性,我們可以通過(guò)key獲取這個(gè)屬性,見(jiàn)上面代碼:objc_getAssociatedObject, 第二個(gè)objc_setAssociatedObject設(shè)為nil,則是刪除這個(gè)屬性。
這兒還有一個(gè)例子:http://oleb.net/blog/2011/05/faking-ivars-in-objc-categories-with-associative-references/關(guān)于category,大家就google一下吧。
小結(jié):詳解Objective_C擴(kuò)展機(jī)制學(xué)習(xí)的內(nèi)容介紹完了,希望通過(guò)本文的學(xué)習(xí)對(duì)你有所幫助!