黑魔法防御课add_e哪里有卖点

小设备add-E让普通自行车变身电动自行车
  [之家 ] 世界各地有很多通勤者每天使用他们的自行车上班下班。美中不足的长距离的骑车会让通勤者疲惫,为了减轻疲惫,电动自行车是一种选择,但是价格昂贵,现在有一款名为add-E的新产品可以将现有自行车轻松改装成电动自行车。add-E项目已经在Indiegogo上完成众筹,筹集到321300欧元,它是一个小型电动滚筒和电池系统,让用户的自行车前进数英里,而无需踏板,让用户可以在上班路上比较轻松一点。
  add-E系统包括把一个普通自行车变成电动自行车所需的所有组件。该设备体积和重量足够小,以减轻对自行车的载重负荷,它可以放在任何现有的自行车上。add-E系统的电源包看起来像一个水瓶,并适合放置于普通自行车水壶架。
  add-E系统有两个版本,一个是装配在踏板轴承山,另外一个是安装在上脚架。add-E系统价格不便宜,价格高达1100欧元,预计8月份开始出货。
关注微信公众号:bikehomecc
看五分钟,买不再被坑,自行车资讯,,,买卖尽在,下载手机。
转载请注明来源及链接: 否则后果自负!
已有人参与,
经销商推荐
经销商名称销售热线商家资讯
360021-028-3
更多关于的资讯
更多关于的促销信息
报价:暂无报价
0张图片&42篇文章
大行电动车图片
同厂商车型排行
暂无报价10
周排行总排行热门文章
12345678910
热门车型热门品牌
Copyright ©
All rights reserved.
自行车之家西方的黑魔法【涉及德鲁伊】_暗黑3吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0可签7级以上的吧50个
本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:967,254贴子:
西方的黑魔法【涉及德鲁伊】
此文为转载。
大家觉得对战组合会是谁...
无授权,侵删
有时候 经常一句话噎到...
本人职业黑魔法,一选别...
皮肤暗黑粗糙,上海美莱光子嫩肤,连锁品牌美肤,全面改善皮肤暗黄,松弛,暗黄色斑,嫩肤补水,全国连锁品牌,
德鲁依教团员和教士
Druid一词分两部分理解:前半部很大程度上和希腊文的「drus」相关,是橡树的
意思;而后半部与印欧语系的词尾「-wid」相似,意:去了解。而德鲁依教又以
橡果为圣果,更证明其名字的古意是熟悉橡树之人。
德鲁依教士是很高级的凯尔特人祭伺、法师或预言者。而凯尔特人是一个在公元
前5世纪至公元1世纪散居在高卢、不列颠、爱尔兰、欧洲、小亚细亚和巴尔干半
德鲁依教的仪式和教义都是非常神密的,而且只依惯例口头传授。所以,虽然经
过历代研究和探索,依然所知甚少。多数有关他们的资料是来源于古希腊和古罗
马的文献。除此之外,考古学家只能从森林、神坛、庙宇的遗迹中偶然寻得一些
如图画、记号等的微小线索而已。在史书上最早有关于德鲁依教团的记载主要是
见于朱理亚。
凯撒和古罗马最伟大的史学家塔西佗斯的著作中。在这些著作中,多是描述德鲁
依教的野蛮和恐怖!凯撒远征高卢时曾向元老院报告说:「德鲁依教教士在当地
有仲裁和主祭等重要地位和权力,而且该教教士精通物理、化学;在树林中居住
,用金镰刀砍伐神圣的橡树果,甚至用活人献祭!」但在大多数情况之下,德鲁
依教士是公认的古代智能的守护者,有着崇高的道德修养,并对自然科学和神学
有很深的造诣。
德鲁依教士精通占卜,对祭祀之礼一丝不苟,也长于历法、医药、天文和文学…
同时,他们也是执法者、吟游诗人、探险家的代名词。男女皆可为德鲁依教士,
同样在社会上享有崇高的地位。也有史学家将德鲁依教士与印度的婆罗门(Brahmi
ns)、波斯祅僧(Magi)、埃及祭师(Priests)和巫医(Shamans)相等同。
在祭典中,德鲁依教士在满月的第六日收割橡果,而在过程中橡果不能堕地,并
盛在纯白的布里。然后牺牲两头白色公牛,再举行宴会。他们也会献祭活人,通
常这些牲人都是犯人,但如果实在没有的话,就会在平民中挑选。受难者或被关
在木笼中活活烧死,或用木柱刺穿,或用利器插死,或用乱箭射死…或是执行最
神圣的「三重死亡」(只有被挑选成为德鲁依王子的人才可接受这个仪式,而死
者也通常是自愿接受的)首先,用斧头将牲人打晕,再迅速用由动物肌肉扎成的
有三个结的绳子将其勒杀,并同时割开其喉咙,最后面朝下地将牲人放在四尺深
的水里,表示最后是淹死的,而牲人死前吃的最后的食物是撒有橡果的烤大麦饼
…就是这些残忍的活人祭祀激怒了罗马政权而加速了他们的灭亡。而后世也有学
者为德鲁依教士开脱,但作为主祭的高级祭伺,似乎是难以脱罪的…
在预言的过程中,德鲁依教士往往借鸟兽如乌鸦、老鹰等来占卜吉凶。有时也观
察牲人的喉咙和内脏来作出预言。来节日时,德鲁依教士会举行仪式,将人催眠
,然往互换灵魂,再以梦境预知未来。
史书上也记载了一些德鲁依教士使用的魔法,如用草药和橡果等施放幻术和护身
符;用发怒的毒蛇的吐沬浸过的魔蛋可以控制他人等…
德鲁依教徒也相信灵魂的永恒,这点有点像轮回。他们会在亲人死后将所有死者
生前的物品一并烧掉,甚至跳到火中抱住亲人的尸体,以便与亲人同登极乐…他
们也会写信给已死的人,甚至提高货款额以便对方可以在死后偿还…
在公元1世纪左右,罗马帝国恐怕凯尔特人势大,对其进行大举讨伐。塔西佗斯
曾记载,在战斗中,德鲁依教团员身穿黑衣,跳跃在凯尔特的军队中,咆哮着天
神的名字,刺耳地诅咒着罗马帝国。在罗马战胜后,不但屠杀了全部凯尔特士兵
,而且也血洗了德鲁依教,并将其教士尸体遗弃在德鲁依教神圣的森林里…这一
役令德鲁依教在以后的几个世纪里都一蹶不振,在以后的几代里他们的力量和地
位与普通巫师无异…直至公元16、17世纪,德鲁依教仍然只存在于民谣山歌之中
17世纪,英国古董家约翰.欧伯利指出,在罗马时期的德鲁依教可能包涵了一些更古老的信仰,相传他们兴建了著名的Stonehenge(在英国Salisbury平原上的史前
时期巨大石柱群, 好象Act 1里Stonefield中的石柱群)用来献祭太阳神!虽然他
的说法有误,但终在18世纪掀起了德鲁依教复兴运动。
公元1717年,人称德鲁依大祭师的威廉.史度克里和约翰.托兰重建了德鲁依
教,而后的亨利.荷力恢复了其古代教条,使其成为一类似共济会的慈善团体。
有趣的是,在美国的德鲁依教团却是为了完全不同的目的而成立的。话说19
63年,北美革新德鲁依教团成立,而教团的成立却只是因为当时明尼苏达州Carle
ton College in Northfield的一群大学生反对学校强逼学生参加宗教服务,进而
成立的组织。后来,该组织发展成为一提倡新异教信仰的德鲁依教团发展至今。
死灵魔法师
Necromaner中译:死灵魔法师、通幽师、神术师、巫师等:
在所有的黑魔法中最为黑暗的毫无疑问的非死灵术/通幽术(Necromancy)莫
属,而且也是最丑恶和最令人厌恶的魔法仪式之一。Necromancy一词出于希腊文
,意即死亡和超自然的神力。而死灵术本身是指古代与死亡世界沟通的一种方法
。死灵魔法可以追述到古波斯、希腊、罗马和中世纪的巫师。死灵术可以分为两
个支派:一派召唤和支配鬼魂(死灵派),这派比较常见;一派掌握死尸回魂大
法(死尸派),而两派都与被禁的黑魔法有着不可分割的关系。死灵派通常以开
坛和符咒来作法,而死尸派通过掘尸和盗墓从而获得所需要的恐怖黑色魔力。死
灵师通常被恐怖的死亡所包围,他们身穿从死人身上偷来的衣服,沉思着死亡的
如果没有在灵魂和死亡的知识上有一定程度的造诣,是不可能明白死灵术的奥秘
的,而且如果冒然从事,后果是很危险的。由于在一般情况之下,死人是不会返
回人间的(不论是以实体或鬼魂),如果真的发生上述情况,那一定是因为有非
常特别的原因。如果一个活人想与另一个世界建立联系、支配灵魂但却不顾死者
的请求的话,那就要小心学习黑魔法中有关的知识,以免反倒成为怨灵手下的受
最初,那些与死灵沟通的人多是出于谋利的动机。因为大家都认为死后是可以无
所不知和无所不见的,所以死灵师召唤死人在很大程度上是受雇于那些想知道宝
藏位置的人,而这些召唤仪式通常都在人死后12个月后才进行,因为民间相信在
人死后的12个月内,灵魂一直都在墓地附近徘徊,不能见到活人想见的东西。但
太老的尸体通常是不会被选择的,因为就死尸派来讲,太烂的尸体是不能清楚回
答问题的。到后来,死灵师开使召唤死灵和尸体用来攻击他人,这些多发生在古
埃及和希腊。
由于出于以上的目的,所以通常都要抑制死灵的怨气,而这样做是需要特别的魔
法帮助的,这些通常只有很有经验的巫师才能做到。在英国的巫师古籍中曾有死
灵师在死尸胸部画上符咒施法的记载。有时,死灵师更需要召唤一些强大的魔神
来保护自己或驱使死尸和鬼魂服从自己。在古希腊咒文中记载着死灵师曾召唤过
哥尔(Kore)、珀耳塞福涅(Persephone)、厄里斯克革(Ereshkigal)、阿多
尼斯(Adonis)、赫密士(Hermes)和托提(Thoth)来保护自己和控制死灵。
而在罗马的戏剧中,对死灵仪式的描术还包括烧烙和歃血。在另一些仪式上,死
灵师会吃象征着海克特(Hecate—巫师的守护神)的狗肉;还吃未腌过的和未发
酵的黑面包、未发酵的葡萄汁,这些象征着腐烂和死亡。
在欧洲大陆,对死灵魔法仪式的要求就更加严格了。仪式的地点通常被小心地指
定在一些荒废的十字路口、地下室、废墟、人迹罕至的森林或枯萎的灌木丛中。
一但决定了仪式的时间,一些像征力量的同心圆和难以形容的符号便被画在场地
中,并冠以神圣的名字。
这些圆圈都是被魔力诅咒过的,而死灵师的助手就站在圈子的中央,并用魔法保
护起来。最后,死灵师权仗在手,作法召唤阴间的灵魂。如果作法成功,死灵从法阵中出现,死灵师要面对死灵们无法忍受的尖叫和恐怖且无法听懂的怨语…有
时,强大的死灵更加以怪兽的形态在圈中狂啸,威胁着要把死灵师撕成粉碎!当
死灵最终屈服在巫师的脚下时,通常会变形为**的幽灵,然后回答巫师的提问
当降灵会结束的时候,死灵通常会消失于硫磺的毒雾之中,而死尸则要由巫师用
生石灰烧掉。在这之前,死灵师务必留在圣圈之中,如果非要离开的话,一定要
再举行一些其它的仪式才行。死灵师还要在仪式前后除去所有该地的花草,并烧
掉它们,再将其灰烬深埋在该地。整个仪式都充满了恐怖的危险,最轻微的失误
也会导致死灵师的死亡,甚至灵魂上的永久创伤…17世纪时,名及一时的埃及死
灵师和预言家齐严刚及(Chiancungi)就是因为心急离开了圣圈而被怨灵碾得魂
教堂派死灵师,一个黑魔法中很特别的支派。该派死灵师用的是很奇特的黑魔法
。相传在午夜时分,该派死灵师会在墓地吟诵黑暗诗篇:“亡灵复活近我身”然
后分散进入教会墓地。在召唤时,他们会哭唱:“E go sum te peto et uidere
queo”,而在退散时,他们会命令道:“回到神所指定的国度吧”。
以下是史上最伟大的教堂派死灵师-约翰.帝依博士(Dr. John Dee)和他的助
手:爱德伍德.凯尔雷(Edward Kelley)的一段描述:当助手用火把照亮了死亡
的仪式的时候,博士站在墓地里,手持权仗并同时读着咒语。在火光中可以清楚
地看到一具刚刚被召唤的死灵在白布中颤抖着…而另外两个巫师则在圣圈中暗吟
着保护自己的咒语,隐约听到一些天使的名字:「拉斐尔(Raphael)、拉依尔
(Rael)、米拉顿(Miraton)、泰米尔(Tarmiel)、雷克斯(Rex)…」…
另一位史上最著名的死灵师是因达尔(Endor)。在圣经中记载了他曾经为扫罗
王召唤死去的预言家撒母尔(Samuel),而预言了扫罗王的灭亡。
另外在1世纪的希腊,有著名的死灵师阿波罗尼俄斯(Apollonius)和泰安那
(Tyana)。
16世纪的英国,有上述的约翰.帝依和他的饭桶助手爱德伍德.凯尔雷。
在17世纪的法国,有伟大的埃利法斯.利维(Eliphas Levi)。他曾试图召唤伟大
的阿波罗尼俄斯,但却被阿波罗尼俄斯的灵魂所震慑!
对死灵师而言,数字9和13是极具意义的。9代表了在古信仰中,灵魂由生到死所
要通过9个领域。13则代表了耶苏的最后晚餐及其复活。
在巫毒教中,尸体被复活时是以巴隆.撒麦迪(Baron Samedi,衣衫褴褛的丧尸之
神)的形态出现。在海地,死灵尸是以奈布爸爸(Papa Nebo,死亡之父)的化身
来主持仪式的,在仪式中,以白腊滴在尸体的脚、唇,死灵师身穿僧袍,头戴银
帽,奈布爸爸的符饰挂在十字架上。当巫师的僧袍和帽子振动时,证明已唤醒巴
隆.撒麦迪,仪式也作成功。
之所以死灵魔法为人所唾弃,除了其目的不正之外,最令人法发指的是,在仪式
中,多要用死尸来作施法所用之物的原料。而且死灵魔法相信,在暴力中死去或
是夭折的死尸是最好的药引!因为他们认为这类死人有更多未用的灵力。在古北
欧人的巫术中,最强的死灵师甚至可以令刚死在绞架上的人复活!16世纪的宗教
审判官保罗斯.格瑞兰迪俄斯(Paolus Grillandus)曾记载着:“死灵师用一些
烧焦了的死尸碎片,尤其是那些吊死和受辱而死的人…用小块指甲或牙…头发、
耳朵或眼睛…肌肉、骨头或鲜肉…”更有一些死灵师有食尸的行为,尤其奢食未
受洗的婴儿。所以在当时有很多坟墓被盗。而史上最出名的有关案件是爱尔兰女
死灵师—爱丽丝. 吉蒂勒(Alice Kyteler)她因为偷掘和使用死尸的头发和头骨
而被起诉,俱说在死尸头上长出的苔草对死灵师是十分珍贵的…
在16、17世纪掀起的猎巫运动中,大量的死灵师也不可避免地成为被猎的目标。
教会高喊他们是魔鬼的仆人,而圣经中有关因达尔的描写更证明死灵师是毁灭的象征。而死灵师们则一直争拗着亡灵和魔鬼的区别。经过几世纪的抗争,死灵师
们终于演化成今天的通灵师,从而避过了宗教上的****。不仅如此,通灵师们在
媒体的宣染下,更进一步被人所崇拜和接纳。近代比较著名的通灵师有乔瑟夫.
格兰威尔(Joseph Glanvill)、法兰西斯.冯.海尔墨特博士(Dr. Francis van
Helmont)、亨利.摩尔博士(Dr. Henry More)、罗卜特.波伊尔(Robert Boy
le)等。而与通灵有关的比较著名的事件有寇克小路的鬼魂(The Cock Lane
ghost):一个死去的女人和她死去的姐姐的丈夫徘徊在伦敦寇克小路的旧居里
,没人知道为什么,却吸引了无数通灵师来寻找他们还阳的原因。(电视剧X
-file有一集就和这件事有关)
中世纪的巫师和魔法师
巫术(Sorcery),来源于法文的「Sor」,原意是指能够经由祭祀或象征的仪式
去改变他人命运的人;而「Sors」前缀在拉丁文中的意思是遭遇或命运,而巫师
最常见的施法形式是下咒语。由此可以引申到所有用咒语来控制爱情、生长、运
气、健康和财富等的行为。在大多数社会中,咒语被认为是为邪恶的目的而生,
而巫师(Sorcerer and Sorceress,通常是女性)是会用咒语以主观的仇恨去伤
害他人的。另一方面,巫师也可以用咒语来对抗邪恶力量,保护自己和他人的。
巫师在一个社会中有很多的功用:他们可以用魔法保护他人,以免受到自然灾害
、外来者和敌人的伤害。他们也负责改正错误,衡量对错,操控大自然和解释恐
怖的现象等。
巫术是一种低层次的法术,因为它不是一种信仰,但与高级法术一样,也是带有
机械性和直观性的。但对比巫毒那种纯邪恶的法术来说,巫术是比较接近一种宗
教的了。而且巫术也有仁慈的一面,例如用来保护村庄和部落,抵挡邪恶的敌人
和灾害等。但如果被一些心术不正的人所利用的话,它也可能是非常邪恶的!虽
然巫师主要是使用咒语,但也会使用魔药。不过无论是哪一样,都可以用来夺取
他人的生命…
历史上有很多神灵是与巫术有关的,因为巫师会负责传示神谕,解读魔术牌,看
相等一些类似的活动。尽管是这样,巫师或更确切一些地称女巫们还是经常被人
们与邪恶画上等号…例如在夜间举行的巫魔大会(Sabbat)里,他们会像死灵师
一样召唤死灵;像变形族(Metamorphosis)一样变换形体;或吃人肉,或控制
恶梦;甚至会与低等恶魔和吸血鬼等发生性行为!
女巫,之所以被认为是邪恶的是因为大多数巫术派别相信,她们天生就是魔鬼的
化身,天生就有魔鬼的力量和天生就充满了愤怒和妒忌。女巫们通常在出生时就
有一些特别的物理上的记号,例如胎记、体内有异物或阴阳眼(Evil Eye)。这
些都是20世纪人类学家E.爱文斯-皮特卡德(E.Evans-Pritchard)在非洲Zande
地方有系统地研究当地女巫几十年后所得出的结论,虽然这个结论不是放诸四海
而皆准,而且也不适用于西方的新异教巫术文化,但也为该类研究打响了第一枪
在巫术最简单的形式里,巫术是一种控制大自然力量和意念移物的魔法。在新石
器石代的洞穴壁画上,已画有半人半兽的巫师作法召唤森林之神的事迹。到了古
希腊,人们相信巫师只是召唤一些介乎于天堂和大地之间的中立魔神(希腊语:
daimones),但这些魔神也是很容易就变成魔鬼的,直到后世的柏拉图的学生
Xenocrates将daimones彻底定义为魔鬼。
到了中世纪,在天主教的影响下,庞大的猎巫行动开始了,无数女巫葬身于火海
之中或死于利箭和断头台之下…女巫从此变得更加邪恶了。但在文艺复兴的时候
,事情发生了戏剧性的变化,男巫(Sorcerer)成为了饱学之士,如炼金士、医
生等的代名词。甚至有人相信这些人的知识是从超自然的来源里得到的。更有很
多贵族和主教都争先研究起巫术来。
但直到现在,女巫的社会地位也没有太大改变,在大多数的社会文化里,都认为
女巫是魔鬼的情人,邪恶的化身。虽然有人试图说服他人女巫并没有想象中可怕
,但这并不是一件容易做到的事情…
女巫的资料虽多,但Soceress的就不太多,一来是Blizzard和AD&D等经典游戏把
这个巫术支派给捧大了,二来自古Sorcery、Witchcraft、Necromancy和Wizard等
都分不开,大家都是类似巫师、妖术等的意思,所以在这里就不多讲了。
虽不知,但觉厉.
贴吧热议榜
使用签名档&&
保存至快速回贴(摘抄整理纠错)KVO回调机制 俗称黑魔法 - 简书
<div class="fixed-btn note-fixed-download" data-toggle="popover" data-placement="left" data-html="true" data-trigger="hover" data-content=''>
写了20004字,被26人关注,获得了21个喜欢
(摘抄整理纠错)KVO回调机制 俗称黑魔法
看看了cocoachina的文章突然想自己来研究一下,研究后发现cocoachina中说也不完全准确。/ios/95.html修正后如下: 在IOS中许多机制来供我们来进行回调,说起回调那么久多说两句: 包括:协议(delegate),KVO,block,addtager等 单说KVO这个有趣的机制能在很多情况下,来解决我们的实际问题,特别是随机触发事件。使用对于我们来说已经不存在问题,我们来关心更深入的底层东西:编译器如何完成监听这个任务尼?苹果文档给出了描述:Automatic key-value observing is implemented using a technique called isa-swizzling... When an observer is registered for an attribute of an object the isa pointer of the observed object is modified, pointing to an intermediate class rather than at the true class .. 简单理解是这样的:我们对某个对象完成监听的注册后,isa这个指针指向一个新生成的中间类,编译器会监听这个中间类,从某个意义上来说,这是一个骗局。 类的结构:typedef struct objc_class *Ctypedef struct objc_object{C} *这里说明一下isa这个指针, isa是一个指向Class类指针(专业术语是指向元类,pointer to the metaclass),用来指向类的类型,我们可以通过object_getClass方法来获取这个值; 正常来说,class方法内部的实现就是获取这个isa指针代表的元类(metaclass),但在kvo机制中苹果注册监听对象后 通过objc_allocateClassPair动态重新创建了一个新类和元类,此时object_getClass()获取的事就是不适原来isa而是是新建的元类 参见苹果文档:Creates a new class and metaclass.You can get a pointer to the new metaclass by calling object_getClass(newClass))。另外备注下[self class]和object_getClass(self)可是不一样的,具体什么不一样参考:/questions//object-getclassobj-and-obj-class-give-different-results(一个返回的是类,一个是实例,能一样吗?)在oc中,规定只要拥有isa指针的变量,通通都属于对象。 最上边的代码 objc_object就是我们常用的基类NSObject的结构体。因此oc不允许非NSObject子类的对象(block例外),原因 你当然懂,如果出现了非这样类,苹果的好多机制就成摆设了,不是变成C++了吗?苹果没有说具体的细节,那么我们通过实验来一点点扣出其中的KVO运行奥秘。 具体做法原理如下: 既然说监听后改变isa的指针,那么我们就来输出监听前后isa的对象对比,来进一步探秘kvo。例如: 监听前:NSLog(@"address: %p", self);NSLog(@"class method: %@", self.class);NSLog(@"description method: %@", self.description);NSLog(@"use runtime to get class: %@", object_getClass(self));[self addObserver: self forKeyPath: @"view" options: NSKeyValueObservingOptionNew context: nil];监听后:NSLog(@"address: %p", self);NSLog(@"class method: %@", self.class);NSLog(@"description method: %@", self.description);NSLog(@"use runtime to get class %@", object_getClass(self));address: 0x7f927a81d200class method: UITableViewdescription method:use runtime to get class: UIViewController===================================================address: 0x7f927a81d200class method: UITableViewdescription method:use runtime to get class NSKVONotifying_UIViewController除了通过object_getClass获取的类型之外,其他的输出没有任何变化;另外,我们还看到了新类相对于self类添加了一个NSKVONotifying_前缀,添加这个前缀是为了避免多次创建监听子类,节省资源。那么怎么实现类似的效果尼? 既然知道了苹果的实现过程,那么我们可以自己动手通过运行时机制来实现KVO。runtime允许我们在程序运行时动态的创建新类、拓展方法、method-swizzling、绑定属性等等这些有趣的事情。在创建新类之前,我们应该学习苹果的做法,判断当前是否存在这个类,如果不存在我们再进行创建,并且重新实现这个新类的class方法来掩盖具体实现。基于这些原则,我们用下面的方法来获取新类(Class)createKVOClassWithOriginalClassName: (NSString *)className { NSString * kvoClassName = [kLXDkvoClassPrefix stringByAppendingString: className]; Class observedClass = NSClassFromString(kvoClassName); if (observedClass) { return observedC } //创建新类,并且添加LXDObserver_为类名新前缀 Class originalClass = object_getClass(self); Class kvoClass = objc_allocateClassPair(originalClass, kvoClassName.UTF8String, 0); //获取监听对象的class方法实现代码,然后替换新建类的class实现 Method classMethod = class_getInstanceMethod(originalClass, @selector(class)); const char * types = method_getTypeEncoding(classMethod); class_addMethod(kvoClass, @selector(class), (IMP)kvo_Class, types); objc_registerClassPair(kvoClass); return kvoC } 另外,在判断是否需要中间类来完成监听的注册前,我们还要判断监听的属性的有效性。通过获取变量的setter方法名(将首字母大写并加上前缀set),以此来获取setter实现,如果不存在实现代码,则抛出异常使程序崩溃。SEL setterSelector = NSSelectorFromString(setterForGetter(key)); Method setterMethod = class_getInstanceMethod([self class], setterSelector); if (!setterMethod) { @throw [NSException exceptionWithName: NSInvalidArgumentException reason: [NSString stringWithFormat: @"unrecognized selector sent to instance %p", self] userInfo: nil]; } Class observedClass = object_getClass(self); NSString * className = NSStringFromClass(observedClass); //如果被监听者没有LXDObserver_,那么判断是否需要创建新类 if (![className hasPrefix: kLXDkvoClassPrefix]) { observedClass = [self createKVOClassWithOriginalClassName: className]; object_setClass(self, observedClass); } //重新实现setter方法,使其完成 const char * types = method_getTypeEncoding(setterMethod); class_addMethod(observedClass, setterSelector, (IMP)KVO_setter, types); 在重新实现setter方法的时候,有两个重要的方法:willChangeValueForKey和didChangeValueForKey,分别在赋值前后进行调用。此外,还要遍历所有的回调监听者,然后通知这些监听者:static void KVO_setter(id self, SEL _cmd, id newValue) { NSString * setterName = NSStringFromSelector(_cmd); NSString * getterName = getterForSetter(setterName); if (!getterName) { @throw [NSException exceptionWithName: NSInvalidArgumentException reason: [NSString stringWithFormat: @"unrecognized selector sent to instance %p", self] userInfo: nil]; } id oldValue = [self valueForKey: getterName]; struct objc_super superClass = { .receiver = self, .super_class = class_getSuperclass(object_getClass(self)) }; [self willChangeValueForKey: getterName]; void (*objc_msgSendSuperKVO)(void *, SEL, id) = (void *)objc_msgSendS objc_msgSendSuperKVO(&superClass, _cmd, newValue); [self didChangeValueForKey: getterName]; //获取所有监听回调对象进行回调 NSMutableArray * observers = objc_getAssociatedObject(self, (__bridge const void *)kLXDkvoAssiociateObserver); for (LXD_ObserverInfo * info in observers) { if ([info.key isEqualToString: getterName]) {dispatch_async(dispatch_queue_create(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ info.handler(self, getterName, oldValue, newValue); }); } } } 所有的监听者通过动态绑定的方式将其存储起来,但这样也会产生强引用,所以我们还需要提供释放监听的方法:(void)LXD_removeObserver:(NSObject *)object forKey:(NSString *)key { NSMutableArray * observers = objc_getAssociatedObject(self, (__bridge void *)kLXDkvoAssiociateObserver); LXD_ObserverInfo * observerRemoved = for (LXD_ObserverInfo * observerInfo in observers) { if (observerInfo.observer == object && [observerInfo.key isEqualToString: key]) { observerRemoved = observerI } } [observers removeObject: observerRemoved]; } 虽然上面已经粗略的实现了kvo,并且我们还能自定义回调方式。使用target-action或者block的方式进行回调会比单一的系统回调要全面的多。但kvo真正的实现并没有这么简单,上述代码目前只能实现对象类型的监听,基本类型无法监听,况且还有keyPath可以监听对象的成员对象的属性这种更强大的功能。尾言对于基本类型的监听,苹果可能是通过void *类型对对象进行桥接转换,然后直接获取内存,通过type encoding我们可以获取所有setter对象的具体类型,虽然实现比较麻烦,但是确实能够达成类似的效果。钻研kvo的实现可以让我们对苹果的代码实现有更深层次的了解,这些知识涉及到了更深层次的技术,探究它们对我们的开发视野有着很重要的作用。同时,对比其他的回调方式,KVO的实现在创建子类、重写方法等等方面的内存消耗是很巨大的,因此博主更加推荐使用delegate、block等回调方式,甚至直接使用method-swizzling来替换这种重写setter方式也是可行的。
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
选择支付方式:

我要回帖

更多关于 黑魔法 的文章

 

随机推荐