iTunes软件和那个软件有冲突,刷机精灵,优刷,英雄联盟,真心金牌,百度云盘,爱思助手下载

这个只看重召回率(宁可错杀一万不要放过一个)的话,图像识别的技术已经可以做到不错了。根据每一帧里面的图像抽取特征,然后跑个分类器就好了。&br&Porn这种模式单一,重点突出,机位固定,然后人体各个部位pattern又那么明显,相信只要有足够的训练数据,并不是一个特别难的机器学习问题。&br&当然你硬要拍两个奥特曼高达穿着盔甲干啥啥,估计不太好识别= = 但是人观众也是为了简单的刺激,你硬搞这么深奥的想必市场不怎么样吧?&br&误杀一般都是加菲猫之类的....毕竟全身都是黄的。&br&&br&具体百度网盘是怎么做的,我猜是机器学习+MD5识别。如果我来干这个的话,先按照经典的方法做一个模型出来,特征就是视频图像识别的特征+文件名文本特征+文件格式,大小等特征。模型拿个常见分类器就行了。&br&估计音频特征也可以,porn的音频特点也很明确(日语 or 英语那些词太明显了),一抓一个准。&br&&br&继续丧心病狂的话就加视频特征。连续多帧里面人数量的变化啦(人数量相对固定,大都是一到两个,三四个也有,再多就不是那么常见了);人物移动的pattern啦(很少大范围的移动,而更多是小范围的往复运动);发生的场景啦(大都是室内小空间,并连续很多分钟都是一个场景啦,偶尔有一些外景)。&br&&br&不过我觉得完全不需要这么复杂就可以做到很高的准确率了......&br&&br&有模型之后,每隔一天或者几天,具体根据模型效率和机器的负载来决定,在网盘的图片和视频数据上跑一遍,把不该有的东西干掉,然后记录下MD5码。 &br&这些MD5码就是黑名单了,往后每次用户新上传的时候就用这个MD5码做一次判断,不该有的就不让你传了。就是一次哈希查找,效率很快,根据百度网盘本身极速上传功能推断,百度已经有了很成熟的MD5操作的模块了。&br&&br&这两个加起来就既满足了效果(靠机器学习模型每隔一段时间的精确判断),也满足了效率(MD5实时校验)。&br&所以呢,你们不要以为改了MD5码就可以逃得过去了,过一段时间人家重跑自动识别算法时还是会被干掉的...这种内容我党管的那么严,搞不好部门领导就要被喊去喝茶的,不可能不好好做的...&br&&br&&br&---------------------------------------闲扯的分割线--------------------------------&br&&br&&br&色情内容识别是一个很认真的研究领域好咩。不过...&br&干这个确实需要大量的训练数据。当年中科院计算所有一个组在做这方面的国家项目,黄色+反动内容识别。人家都是带着条子和公款去国外采购影片和轮子的东东回来做训练数据的......&br&&br&我不懂事的时候有个女朋友花钱太厉害,逼的没办法去一家前著名论坛网站打零工做过类似项目,不过是自动识别黄色/反动的文本...... &br&他们有积累了很久的人工识别的数据。招了不少人做类似鉴黄师的工作,三班倒每班连干八小时,拿一个简单的搜索引擎对用户发布的内容不停地用各种关键词搜,看到不该看的就删帖+搜集起来。然后这些人工识别的数据拿来给我们训练自动识别模型。&br&&br&当时为了提高识别效果我被迫看了好多训练数据。。。。。。&br&我只能说......太刺激了....太暴力了....太有想象力了......&br&我原先只知道有黄色的,有反动的,没想到还有黄色+反动的........&br&你能想象拿四人帮做主角的XX小说么........看起来真是一种复杂的感受....类似比利时啤酒,无数种强烈风味的混合,造成了独特的饮用体验...&br&&br&总之,这对于纯洁的我实在是太下流了....&br&一张白纸的我就这么被污染了...&br&再也回不去了......&br&&br&喂,你们不要误会,我那个工作是做模型自动识别来着,不是人工看好么。。。&br&而且也只是那半年工作很小的一部分。。。大部分时间还是在给他们做站内搜索和开发公司自己的基础C++库来着。&br&&br&人工谁要干啊,估计时薪只有十块钱,还要看那么多好恶心的东西...黄瓜茄子一看就会想呕怎么办......
这个只看重召回率(宁可错杀一万不要放过一个)的话,图像识别的技术已经可以做到不错了。根据每一帧里面的图像抽取特征,然后跑个分类器就好了。 Porn这种模式单一,重点突出,机位固定,然后人体各个部位pattern又那么明显,相信只要有足够的训练数据,并…
这里有很多槽点可吐。&br&&br&简短回答:&br&进程地址空间的分布取决于操作系统,栈向什么方向增长取决于操作系统与CPU的组合。&br&不要把别的操作系统的实现方式套用到Windows上。&br&&br&x86硬件直接支持的栈确实是“向下增长”的:push指令导致sp自减一个slot,pop指令导致sp自增一个slot。其它硬件有其它硬件的情况。&br&&br&==========================================&br&&br&&b&栈的增长方向与栈帧布局&/b&&br&&br&这个上下文里说的“栈”是函数调用栈,是以“栈帧”(stack frame)为单位的。&br&每一次函数调用会在栈上分配一个新的栈帧,在这次函数调用结束时释放其空间。&br&被调用函数(callee)的栈帧相对调用函数(caller)的栈帧的位置反映了栈的增长方向:如果被调用函数的栈帧比调用函数的在更低的地址,那么栈就是向下增长;反之则是向上增长。&br&&br&而在一个栈帧内,局部变量是如何分布到栈帧里的(所谓栈帧布局,stack frame layout),这完全是编译器的自由。&br&至于数组元素与栈的增长方向:C与C++语言规范都规定了数组元素是分布在连续递增的地址上的。引用C语言规范的规定:&br&&blockquote&An array type describes a contiguously allocated nonempty set of objects with a particular member object type, called the element type.&br&A postfix expression followed by an expression in square brackets [] is a subscripted designation of an element of an array object. The definition of the subscript operator []
is that E1[E2] is identical to (*((E1)+(E2))). Because of the conversion rules that
apply to the binary + operator, if E1 is an array object (equivalently, a pointer to the
initial element of an array object) and E2 is an integer, E1[E2] designates the E2-th
element of E1 (counting from zero).&/blockquote&其实double a0[4]这个声明告诉编译器的是:我需要在栈帧里分配一块连续的空间,大小为sizeof(double)*4,并且让a0引用该空间的起始位置(最低地址);&br&而不是说:我要根据栈的增长方向,先分配a0[0],然后分配a0[1],再分配a0[2],最后分配a0[3],于是如果栈是向下增长那a0[1]就应该比a0[0]在更低的地址——不是这样的。&br&&br&所以在题主给的例子里,a0和a1这两个分配在栈帧里的数组到底哪个在高地址哪个在低地址,其实并不反映栈的增长方向,而只反映了编译器自己的决定。&br&C与C++语言的数组元素要分配在连续递增的地址上,也不反映栈的增长方向。&br&&br&==========================================&br&&br&&b&以简化的Linux/x86模型为例&/b&&br&&br&在简化的32位Linux/x86进程地址空间模型里,(主线程的)栈空间确实比堆空间的地址要高——它已经占据了用户态地址空间的最高可分配的区域,并且向下(向低地址)增长。借用Gustavo Duarte的&a href=&///?target=http%3A//duartes.org/gustavo/blog/post/anatomy-of-a-program-in-memory/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Anatomy of a Program in Memory&i class=&icon-external&&&/i&&/a&里的图:&br&&img src=&/6f7b5a537ccfa641c922_b.png& data-rawwidth=&696& data-rawheight=&570& class=&origin_image zh-lightbox-thumb& width=&696& data-original=&/6f7b5a537ccfa641c922_r.png&&&br&不过要留意的是这个图是简化模型。举两个例子:&br&&ul&&li&虽然传统上Linux上的malloc实现会使用brk()/sbrk()来实现malloc()(这俩构成了上图中“Heap”所示的部分,这也是Linux自身所认为是heap的地方——用pmap看可以看到这里被标记为[heap]),但这并不是必须的——一个malloc()实现完全可以只用或基本上只用mmap()来实现malloc(),此时一般说的“Heap”(malloc-heap)就不一定在上图“Heap”(Linux heap)所示部分,而会在“Memory Mapping Segment”部分散布开来。不同版本的Linux在分配未指定起始地址的mmap()时用的顺序不一样,并不保证某种顺序。而且mmap()分配到的空间是有可能出现在低于主可执行程序映射进来的text Segment所在的位置。&br&&/li&&li&Linux上多线程进程中,“线程”其实是一组共享虚拟地址空间的进程。只有主线程的栈是按照上面图示分布,其它线程的栈的位置其实是“随机”的——它们可以由pthread_create()调用mmap()来分配,也可以由程序自己调用mmap()之后把地址传给pthread_create()。既然是mmap()来的,其它线程的栈出现在Memory Mapping Segment的任意位置都不出奇,与用于实现malloc()用的mmap()空间很可能是交错出现的。&/li&&/ul&&br&==========================================&br&&br&&b&Windows的进程地址空间&/b&&br&&br&然而题主的实验是在Windows上而不是在Linux上做的,从截图看起来至少是Windows 7?&br&Windows的进程地址空间分布跟上面说的简化的Linux/x86模型颇不一样。&br&就算在没有ASLR的老Windows上也已经很不一样,有了ASLR之后就更加不一样了。&br&&br&在Windows上不应该对栈和堆的相对位置做任何假设。&br&要想看个清楚Windows的进程地址空间长啥样,可以用Sysinternals出品的&a href=&///?target=https%3A///en-us/library/dd535533.aspx& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&VMMap&i class=&icon-external&&&/i&&/a&看看。该工具简介请见:&a href=&///?target=http%3A///b/askperf/archive//vmmap-a-peek-inside-virtual-memory.aspx& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&VMMap - A Peek Inside Virtual Memory&i class=&icon-external&&&/i&&/a&
这里有很多槽点可吐。 简短回答: 进程地址空间的分布取决于操作系统,栈向什么方向增长取决于操作系统与CPU的组合。 不要把别的操作系统的实现方式套用到Windows上。 x86硬件直接支持的栈确实是“向下增长”的:push指令导致sp自减一个slot,pop指令导致sp…
也许有点离题,我想介绍一个网站 &a href=&///?target=https%3A///& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Shadertoy&i class=&icon-external&&&/i&&/a&。在那里,你只有画布的座标以及一些额外的输入,然后你可用GLSL shader画任何东西。&br&&br&例如这个星期的 &a href=&///?target=https%3A///view/ldS3Wm& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&shader of the week&i class=&icon-external&&&/i&&/a&:&br&&img src=&/3dfde77e68ce9e9a40347_b.jpg& data-rawwidth=&572& data-rawheight=&321& class=&origin_image zh-lightbox-thumb& width=&572& data-original=&/3dfde77e68ce9e9a40347_r.jpg&&就是用151行GLSL,再加上一张noise纹理渲染出来的动画。&br&&br&最重要的是,你可以在云云高手的作品中学到很多计算机图形学的知识。这远比单单学习一个语言重要得多了。
也许有点离题,我想介绍一个网站 。在那里,你只有画布的座标以及一些额外的输入,然后你可用GLSL shader画任何东西。 例如这个星期的 : 就是用151行GLSL,再加上一张noise纹理渲染出来的动画。 最重要的是,你可以在云云高手的…
先列一些各方面的著名游戏相关的开源项目。&br&&br&商业游戏&br&&ul&&li&&a href=&///?target=https%3A///id-Software& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&id Software · GitHub&i class=&icon-external&&&/i&&/a&:历来各个游戏的完整代码&br&&/li&&li&Unreal Tournament :用开源方式开发&/li&&/ul&&br&游戏引擎/框架&br&&ul&&li&&a href=&///?target=https%3A///& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Unreal Engine 4&i class=&icon-external&&&/i&&/a&:&a href=&///?target=https%3A///blog/ue4-is-free& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&If You Love Something, Set It Free&i class=&icon-external&&&/i&&/a&&/li&&li&&a href=&///?target=https%3A///cocos2d/cocos2d-x& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&cocos2d/cocos2d-x · GitHub&i class=&icon-external&&&/i&&/a&(&a data-hash=&e06ff9745abe4d21b55c58& href=&///people/e06ff9745abe4d21b55c58& class=&member_mention& data-editable=&true& data-title=&@王哲& data-tip=&p$b$e06ff9745abe4d21b55c58& data-hovercard=&p$b$e06ff9745abe4d21b55c58&&@王哲&/a&):长期占领GitHub C++的Trending榜。&/li&&li&&a href=&///?target=https%3A///cloudwu/skynet& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&cloudwu/skynet · GitHub&i class=&icon-external&&&/i&&/a& (云风)&br&&/li&&/ul&&br&渲染引擎&br&&ul&&li&&a href=&///?target=http%3A//www.klayge.org/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&KlayGE游戏引擎&i class=&icon-external&&&/i&&/a&(&a data-hash=&0b21747b1fec79ad8af7e68a2b1ff681& href=&///people/0b21747b1fec79ad8af7e68a2b1ff681& class=&member_mention& data-editable=&true& data-title=&@龚敏敏& data-tip=&p$b$0b21747b1fec79ad8af7e68a2b1ff681& data-hovercard=&p$b$0b21747b1fec79ad8af7e68a2b1ff681&&@龚敏敏&/a&)&br&&/li&&li&&a href=&///?target=http%3A//www.ogre3d.org/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&OGRE – Open Source 3D Graphics Engine&i class=&icon-external&&&/i&&/a&&/li&&/ul&&br&物理引擎&br&&ul&&li&&a href=&///?target=http%3A//box2d.org/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Box2D | A 2D Physics Engine for Games&i class=&icon-external&&&/i&&/a&:Blizzard 的程序员的个人项目&/li&&li&&a href=&///?target=https%3A///bulletphysics/bullet3& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&bulletphysics/bullet3 · GitHub&i class=&icon-external&&&/i&&/a&:作者曾是Havok、Sony、AMD和现在Google的程序员。&br&&/li&&li&&a href=&///?target=https%3A///physx-source-github& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&PhysX Source on GitHub&i class=&icon-external&&&/i&&/a&&/li&&/ul&&br&其他&br&&ul&&li&&a href=&///?target=https%3A///paulhodge/EASTL& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&paulhodge/EASTL · GitHub&i class=&icon-external&&&/i&&/a&&br&&/li&&/ul&&br&我司的游戏部门近半年也在策划把一些公共组件开源,现时有我负责的 &a href=&///?target=https%3A///miloyip/rapidjson& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&miloyip/rapidjson · GitHub&i class=&icon-external&&&/i&&/a&(算是protobuf那个类别),另一个是同组同事的 &a href=&///?target=https%3A///TencentOpen/behaviac& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&TencentOpen/behaviac · GitHub&i class=&icon-external&&&/i&&/a& 行为树组件(就是题主说没有的AI组件)。现在还有一些组件在准备中。但其实要把内部项目开源,需要做很多工作,而且还有之后的维护、更新工作。&br&&br&像游戏引擎这么大型的软件项目,开源所需的成本是具大的。以Cocos2D-x来说,单是要管理上万个pull requests,也是让人敬佩。对于像UE4这种近二百万行代码级别的高端引擎,维护的成本就更大更复杂。&br&&br&撇开游戏引擎这种巨物,物理、动画、人工智能等模块算是更独立一些,较容易整合到不同的游戏中。另一种是插件,例如在GitHub上开源的Unity组件就有很多。&br&&br&其实游戏开发相关的开源很多,历史很久,我估计单单引擎就有上百个。问题是,能做出商业品质游戏的引擎不是很多。一些游戏开发公司,例如id Software,他们开源的目的并不是希望通过社区而提升引擎的品质,或是带来什么商业利益,而仅仅是在于一种分享,供他人学习。&br&&br&----&br&补充一点,传统上Web都是通过社区方式建立标准(如IETF RFC),然后也有开源的服务器和浏览器。然而,游戏开发从来没有什么标准,甚至连文件格式的标准化也不太成功(如Collada)。原因可能是各种游戏本身的需求差异很大,以前曾有人想标准化引擎各部分的接口,来做到能灵活替换各组件,但都没成功。这些问题有可能阻碍开源发展,&br&&br&当然,也许最简单的答案是,游戏业界对开源的确做得不好,我们要继续努力。
先列一些各方面的著名游戏相关的开源项目。 商业游戏 :历来各个游戏的完整代码 Unreal Tournament :用开源方式开发 游戏引擎/框架 :():长…
&a data-hash=&85b8e42bd9cc7c5ef492bbd8& href=&///people/85b8e42bd9cc7c5ef492bbd8& class=&member_mention& data-editable=&true& data-title=&@顾煜& data-tip=&p$b$85b8e42bd9cc7c5ef492bbd8& data-hovercard=&p$b$85b8e42bd9cc7c5ef492bbd8&&@顾煜&/a& 老师讲的是个体层面的东西,除了基础的AI系统,还包括特殊情况下触发的脚本事件,组合形成了怪物的逻辑。如果把这些称作演员(怪物)的自我修养的话,《求生之路》的The Director(导演系统)显然要更胜一筹。&br&&br&The Director不单单控制了单个怪物的行为方式,还在宏观上控制着游戏的步调与难度。熟悉游戏的玩家肯定知道,求生之路并不像植物大战僵尸一样,会在固定的时间告诉你“一大波僵尸正在来袭”。而是会在不经意间用汹涌的尸潮将玩家淹没,让每一次游玩都会有全新的体验。&br&The Director会时刻监控玩家的状态,包括生命、补给、所处位置等等,然后动态确定僵尸的刷新、物品的刷新,甚至能够改变地图的表现形式。同时,与The Director配合的还有 The Music Director,能够根据场上形势动态切换背景音乐以增强渲染力。&br&&br&The Director将游戏进程分为三个阶段:&br&&b&1.Build Up&/b&&br&刚出安全屋时的阶段,各类僵尸的刷新较为平稳、&br&&b&2.Peak&/b&&br&当玩家的紧张值(可量化,下文会交代)达到顶峰时会进入该阶段,这通常也是战斗最为激烈的时候。&br&&b&3.Relax&/b&&br&在该阶段玩家会得到短暂的休息与补给时间,如果继续前进,该阶段将更快结束,并回归到Build Up阶段。&br&其中玩家的紧张值(Survivor Intensity)由玩家的状态决定,被僵尸攻击、击杀僵尸均可以使该值上升,当玩家失去行动能力时紧张值会迅速达到顶峰。&br&即便如此,求生之路中依然有固定的脚本事件,比如发送求救信号并坚持到直升机飞来。这种情况下,The Director会暂时停止。可以说,脚本事件那种特殊情况特殊处理的优点也并没有抛弃。&br&&br&必须要指出的是,The Director并不等同于所谓的“动态难度”。动态难度指的是系统根据玩家的表现临时对游戏数值进行一些细微的调整,比如《马克思·佩恩》中根据玩家水平的高低,系统会修改敌人的血量与瞄准的精确度。这样导致的结果是,游戏既不会太难也不会太过容易,永远是与玩家的当前水平挂钩的。换句话说就是,无论玩多少遍,游戏体验都很雷同。而The Director却能够提供戏剧化的多样游戏体验,并且始终与求生之路游戏类型一致:生存、动作、恐怖。&br&如果你忽略僵尸与末世背景,透过现象看本质的话,The Director其实是在一次又一次地将玩家从舒适区迅速赶出来。这种对期望的挫败能够最大限度地调动玩家积极性,并让玩家对游戏系统、个人能力与物品资源有更深刻的了解。&br&Gabe Newell将求生之路的这种设计模式称为“Procedural Narrative”,原话如下:&br&&blockquote&&This is what makes procedural narrative more of a story-telling device than, say, a simple difficulty mechanism.& -Gabe Newell&/blockquote&The Director不仅仅是一种难度调节工具,更是一种故事叙述的模式。传统的游戏多是通过精妙但固化的关卡设计, 以地理位置或者游戏时间为衡量进度的标尺,来操控玩家的心理状态。而求生之路则更加精妙,除了位置因素外,还考虑了玩家当前的游戏状态,通过阶段转化来调动玩家情绪,有起有落,并且不会重复,可玩性极强。每一次游戏经历都是一次独一无二的故事,是由玩家与AI共同谱写出来的。沙盒游戏虽然也是自己创造的故事,但是毕竟没有真正意义上的主线,玩家即是导演,虽然能够满足创造力丰富的部分玩家需要,但对于广大休闲玩家来说难免会无所适从。而播片式线性游戏又过于死板,大部分内容都是设计者已经定好的,游戏体验比较雷同。The Director所代表的Procedual Narrative可以视作两者的折中,说不定未来会出现更多蕴含这类设计思想的游戏。&br&————————————————————&br&有点跑题了...从AI设计讲到了故事叙述。&br&部分资料来源:&br&&a href=&///?target=http%3A///wiki/The_Director%23Difficulty_and_Game_Modes& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&The Director&i class=&icon-external&&&/i&&/a&&br&&a href=&///?target=http%3A///blogs/BenServiss/193/The_Discomfort_Zone_The_Hidden_Potential_of_Valves_AI_Director.php& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Gamasutra: Ben Serviss's Blog&i class=&icon-external&&&/i&&/a&
老师讲的是个体层面的东西,除了基础的AI系统,还包括特殊情况下触发的脚本事件,组合形成了怪物的逻辑。如果把这些称作演员(怪物)的自我修养的话,《求生之路》的The Director(导演系统)显然要更胜一筹。 The Director不单单控制了单个怪物的行…
这个问题已经有很多优秀的答案了,但最近一周面试了很多iOS开发,也准备了一些题目,忍不住发上来...&br&首先需要声明的是,此次的面试者大多在有1~3年的iOS开发经验,并非需要找一个真正的大牛,所以我准备的题目,自己觉得大多数还是比较基础,比较能够看出这个层次的人的水准的。如果你也是个有3年左右开发经验的从业者,不妨一试。&br&&br&面试开始的时候,我会让面试者选择一个他最熟悉的项目,给我们介绍一下它的技术架构,以及面试者在其中参与的模块和具体工作。因为我本人很讨厌面试上来做自我介绍,所以我一般开门见山,直接开始讲项目了。事实上,很多开发者并不明白我提到的“架构”的具体意思,有些人说了一大堆产品的功能,还有人说的非常笼统(比如,遵循MVC架构之类),一般这种时候我会打断他们,直接让他们给我讲一下这个APP的层次结构,或者是核心模块等。&br&之后我会问两个问题:&br&1. 讲述一次在这个APP中,用户触发了一个事件,引起了一个服务请求,然后获取服务端返回,并且更新前端界面的过程。请说的详细一点,比如数据经过了哪些类的处理,每一次传递时的格式是怎么样的?&br&2. 你参与的APP,是如何处理多个服务的同步发起的?&br&随后让面试者说一下APP的界面架构,这个比较随意。&br&&br&问完了项目,就开始基础知识题啦~&br&&br&&b&Model层:
&/b&&br&&br&数据持久化存储方案有哪些?&br&&br&沙盒的目录结构是怎样的?各自一般用于什么场合?&br&&br&SQL语句问题:inner join、left join、right join的区别是什么?&br&&br&sqlite的优化&br&&br&网络通信用过哪些方式(100%的人说了AFNetworking...)&br&&br&如何处理多个网络请求并发的情况
&br&&br&在网络请求中如何提高性能
&br&&br&在网络请求中如何保证安全性 &br&&br&&br&&br&&b&语言与基础知识:
&/b&&br&&br&内存中的栈和堆的区别是什么?那些数据在栈上,哪些在堆上?&br&&br&#define和const定义的变量,有什么区别&br&&br&什么情况下会出现内存的循环引用&br&&br&block中的weak self,是任何时候都需要加的么?&br&&br&GCD的queue,main queue中执行的代码,一定是在main thread么?
&br&&br&NSOperationQueue有哪些使用方式
&br&&br&NSThread中的Runloop的作用,如何使用?
&br&&br&.h文件中的变量,外部可以直接访问么?(注意是变量,不是property)&br&&br&讲述一下runtime的概念,message send如果寻找不到相应的对象,会如何进行后续处理 ?&br&&br&TCP和UDP的区别是什么?
&br&&br&MD5和Base64的区别是什么,各自场景是什么?
&br&&br&二叉搜索树的概念,时间复杂度多少?&br&&br&&br&&br&&b&架构:(我们招的不是架构师,这方面问的不多,而且从之前对APP的架构介绍里可以边听边问)&/b&&br&&br&哪些类不适合使用单例模式?即使他们在周期中只会出现一次。
&br&&br&Notification的使用场景是什么?同步还是异步?
&br&&br&简单介绍一下KVC和KVO,他们都可以应用在哪些场景? &br&&br&&br&&b&APP相关:
&/b&&br&&br&如何添加一个自定义字体到工程中
&br&&br&如何制作一个静态库/动态库,他们的区别是什么?
&br&&br&Configuration中,debug和release的区别是什么?
&br&&br&简单介绍下发送系统消息的机制(APNS) &br&&br&&b&UI:
&/b&&br&&br&系统如何寻找到需要响应用户操作的那个Responder
&br&&br&多屏幕尺寸的适配
&br&&br&UIButton的父类是什么?UILabel呢?
&br&&br&push view controller 和 present view controller的区别
&br&&br&描述下tableview cell的重用机制
&br&&br&UIView的frame和bounds的区别是什么&br&&br&&br&&b& 最后是几道场景题,也是我最喜欢问的:&/b&&br&&br&发送10个网络请求,然后再接收到所有回应之后执行后续操作,如何实现?
&br&&br&实现一个第三方控件,可以在任何时候出现在APP界面最上层
&br&&br&实现一个最简单的点击拖拽功能。&br&&br&上面那个拖拽之外,如果在手放开时,需要根据速度往前滑动呢?
&br&&br&如何减小一个应用程序的尺寸?
&br&&br&如何提高一个性用程序的性能?
&br&&br&不同版本的APP,数据库结构变化了,如何处理? &br&&br&&br&平心而论,这些题目并没有特别难,没有讲到黑科技,也没有讲到ACM算法题,都是iOS的基础概念以及很容易遇到的场景。可能也是因为我们招的目标,也只是一个可以完成业务开发的3年左右经验的人而已,所以大部分面试者水平并不如意,能答出以上大半题目,同时思路清晰态度积极向上的人,不到四分之一吧...&br&&br&另外的感想就是,这个行业可能真的有点浮躁,很多面试者,连简单的几个场景题都答不出来,基础知识更是一般,只会用几个第三方库,就开口要25~30w的年薪,还有一种爱理不理的感觉。也有些人,在原来的公司,自称是技术负责人,但连APP的基本架构,包括哪些主要模块都讲不清楚,各种兜圈子,甚至有人讲了半天的产品功能和亮点,我不得不一次次打断才能继续面试。&br&&br&其实我从11年开始自学iOS,做的事情越多,越觉得自己有越多的东西要学,离大牛的标准也是越来越远。而无论从深度还是广度来看,iOS开发都是一个值得挖掘的技术领域。由于苹果产品的火热,市场上的iOS开发一直供不应求,但真正有能力,高素质的可能真的不那么多。
这个问题已经有很多优秀的答案了,但最近一周面试了很多iOS开发,也准备了一些题目,忍不住发上来... 首先需要声明的是,此次的面试者大多在有1~3年的iOS开发经验,并非需要找一个真正的大牛,所以我准备的题目,自己觉得大多数还是比较基础,比较能够看出…
请关注facebook的开源项目,个个都是精品
请关注facebook的开源项目,个个都是精品
iOS开发包含的内容有:&br&语言:objective-c,swift&br&设计模式:mvc&br&数据库:sqlite coredata(一套api)&br&操作系统:mac&br&库:太多了,ASI,AFN,FMDB这种大多数都会用到 github一搜一大把,很多不用自己写&br&多人协作:svn,git 经常要用github git是必须会的&br&其他通用知识:http,socket等等&br&&br&至于工具,一上来整这么多没意义,你得会做点东西才用得上工具是不是。&br&有需求就会去分析去找解决方案。&br&比如你发现xcode的文件结构是虚拟的,建了文件夹磁盘上没有,很不好管理,那你就会去找解决方法,然后发现synx就可以解决这个问题。工具是这样搜索,用起来的。&br&&br&&a href=&///?target=http%3A///industry/6.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&iOS开发者有价值的工具集&i class=&icon-external&&&/i&&/a& 前人也是总结了不少。&br&&br&&blockquote&然后一般写iOS的UI有三种方式。xib,Storyboard以及代码创建。我觉得代码是效率最高也最厉害的;关于iPad和iPhone如果要适配的话是不大好的,最好设计两种UI。&br&&/blockquote&&br&不同意,代码确实是最厉害的,但不是效率最高的,对个人而言,autolayout sizeclass绝对是storyboard更有效率,点两下的事情代码几十行(当然基本都是自动补全,我还是嫌多),适配问题有了sizeclass也只需要一套UI了。但为什么说个人而言,因为企业一般因为团队协作问题不喜欢用storyboard,容易发生冲突,所以代码,IB都得会,什么适合用什么。&br&&br&除了上面答案的那些,&br&我也稍稍补充一下资料&br&&a href=&///?target=http%3A///& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Swift语言指南 By @SwiftLanguage&i class=&icon-external&&&/i&&/a&&br&&a href=&///?target=https%3A//www.codementor.io/learn-ios-development& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Learn iOS Online&i class=&icon-external&&&/i&&/a&&br&&a href=&///?target=http%3A///wiki/bb000& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Git教程 - 廖雪峰的官方网站&i class=&icon-external&&&/i&&/a&&br&&a href=&///?target=https%3A///library/ios/navigation/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&iOS Developer Library&i class=&icon-external&&&/i&&/a&&br&&br&目前想到这么多,先这样吧。
iOS开发包含的内容有: 语言:objective-c,swift 设计模式:mvc 数据库:sqlite coredata(一套api) 操作系统:mac 库:太多了,ASI,AFN,FMDB这种大多数都会用到 github一搜一大把,很多不用自己写 多人协作:svn,git 经常要用github git是必须会的 其他…
让我想起了有人私信我,说不缺钱,做个类似知乎的东西,包括加运营,需要多少钱。&br&&br&扯淡结束,正好最近看了一点这方面的东西,也许对题主来说有点帮助。&br&&br&&ol&&li&手机淘宝客户端架构探索实践:&a href=&///?target=http%3A//club.alibabatech.org/resource_detail.htm%3FtopicId%3D153& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&club.alibabatech.org/re&/span&&span class=&invisible&&source_detail.htm?topicId=153&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a&&br&&/li&&li&淘宝iPhone客户端用到的开源代码:&br&&/li&&/ol&&ul&&li&DTCoreText&br&&/li&&li&DTFoundation&br&&/li&&li&HMSegmentedControl&br&&/li&&li&JSONKit&br&&/li&&li&ibextobjc&br&&/li&&li&MAZeroingWeakRef&br&&/li&&li&MBMvc&br&&/li&&li&OBShapedButton&br&&/li&&li&OHAttributedLabel&br&&/li&&li&OpenSSL&br&&/li&&li&PinYin4Objc&br&&/li&&li&PSTCollectionView&br&&/li&&li&PulsingHalo&br&&/li&&li&Reachability&br&&/li&&li&RegexKitLite&br&&/li&&li&RTLabel&br&&/li&&li&SDWebImage&br&&/li&&li&ShareSDK&br&&/li&&li&ZipArchive&/li&&li&AFNetworking&br&&/li&&li&AKSegmentedControl&br&&/li&&li&ASIHTTPRequest&br&&/li&&li&EGOTableViewPullRefresh&br&&/li&&li&NSData+Base64&br&&/li&&li&SBJson&br&&/li&&li&PLWeakCompatibility&br&&/li&&li&Lumberjack&br&&/li&&li&SFHFKeychainUtils&/li&&/ul&
让我想起了有人私信我,说不缺钱,做个类似知乎的东西,包括加运营,需要多少钱。 扯淡结束,正好最近看了一点这方面的东西,也许对题主来说有点帮助。 手机淘宝客户端架构探索实践: 淘宝iPhone客户端用到的开源代码: DTCoreText DTF…
原文链接:&a href=&///?target=http%3A//limboy.me/ios//dynamic-tips-and-tricks-with-objective-c.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Limboy's HQ&i class=&icon-external&&&/i&&/a&&br&&br&文章如下:(读完对OC Runtime有个初步认识)&br&&br&(译)Objective-C的动态特性&br&&p&这是一篇译文,原文&a href=&///?target=http%3A//pilky.me/view/21& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&在此&i class=&icon-external&&&/i&&/a&,上一篇文章就是受这篇文章启发,这次干脆都翻译过来。&/p&&p&过去的几年中涌现了大量的Objective-C开发者。有些是从动态语言转过来的,比如Ruby或Python,有些是从强类型语言转过来的,如Java或C#,当然也有直接以Objective-C作为入门语言的。也就是说有很大一部分开发者都没有使用Objective-C太长时间。当你接触一门新语言时,更多地会关注基础知识,如语法和特性等。但通常有一些更高级的,更鲜为人知又有强大功能的特性等待你去开拓。&/p&&p&这篇文章主要是来领略下Objective-C的运行时(runtime),同时解释是什么让Objective-C如此动态,然后感受下这些动态化的技术细节。希望这回让你对Objective-C和Cocoa是如何运行的有更好的了解。&/p&The Runtime&p&Objective-C是一门简单的语言,95%是C。只是在语言层面上加了些关键字和语法。真正让Objective-C如此强大的是它的运行时。它很小但却很强大。它的核心是消息分发。&/p&Messages&p&如果你是从动态语言如Ruby或Python转过来的,可能知道什么是消息,可以直接跳过进入下一节。那些从其他语言转过来的,继续看。&/p&&p&执行一个方法,有些语言,编译器会执行一些额外的优化和错误检查,因为调用关系很直接也很明显。但对于消息分发来说,就不那么明显了。在发消息前不必知道某个对象是否能够处理消息。你把消息发给它,它可能会处理,也可能转给其他的Object来处理。一个消息不必对应一个方法,一个对象可能实现一个方法来处理多条消息。&/p&&p&在Objective-C中,消息是通过objc_msgSend()这个runtime方法及相近的方法来实现的。这个方法需要一个target,selector,还有一些参数。理论上来说,编译器只是把消息分发变成objc_msgSend来执行。比如下面这两行代码是等价的。&/p&&br&&div class=&highlight&&&pre&&code class=&language-text&&[array insertObject:foo atIndex:5];
objc_msgSend(array, @selector(insertObject:atIndex:), foo, 5);
&/code&&/pre&&/div&Objects, Classes, MetaClasses&p&大多数面向对象的语言里有 classes 和 objects 的概念。Objects通过Classes生成。但是在Objective-C中,classes本身也是objects(译者注:这点跟python很像),也可以处理消息,这也是为什么会有类方法和实例方法。具体来说,Objective-C中的Object是一个结构体(struct),第一个成员是isa,指向自己的class。这是在objc/objc.h中定义的。&/p&&br&&div class=&highlight&&&pre&&code class=&language-text&&typedef struct objc_object {
&/code&&/pre&&/div&&p&object的class保存了方法列表,还有指向父类的指针。但classes也是objects,也会有isa变量,那么它又指向哪儿呢?这里就引出了第三个类型: metaclasses。一个 metaclass被指向class,class被指向object。它保存了所有实现的方法列表,以及父类的metaclass。如果想更清楚地了解objects,classes以及metaclasses是如何一起工作地,可以阅读&a href=&///?target=http%3A///blog/archive//objc_explain_Classes_and_metaclasses.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&这篇文章&i class=&icon-external&&&/i&&/a&。&/p&Methods, Selectors and IMPs&p&我们知道了运行时会发消息给对象。我们也知道一个对象的class保存了方法列表。那么这些消息是如何映射到方法的,这些方法又是如何被执行的呢?&/p&&p&第一个问题的答案很简单。class的方法列表其实是一个字典,key为selectors,IMPs为value。一个IMP是指向方法在内存中的实现。很重要的一点是,selector和IMP之间的关系是在运行时才决定的,而不是编译时。这样我们就能玩出些花样。&/p&&p&IMP通常是指向方法的指针,第一个参数是self,类型为id,第二个参数是_cmd,类型为SEL,余下的是方法的参数。这也是self和_cmd被定义的地方。下面演示了Method和IMP&/p&&br&&div class=&highlight&&&pre&&code class=&language-text&&- (id)doSomethingWithInt:(int)aInt{}
id doSomethingWithInt(id self, SEL _cmd, int aInt){}
&/code&&/pre&&/div&其他运行时的方法&p&现在我们知道了objects,classes,selectors,IMPs以及消息分发,那么运行时到底能做什么呢?主要有两个作用:&/p&&ol&&li&创建、修改、自省classes和objects&/li&&li&消息分发&/li&&/ol&&p&之前已经提过消息分发,不过这只是一小部分功能。所有的运行时方法都有特定的前缀。下面是一些有意思的方法:&/p&class&p&class开头的方法是用来修改和自省classes。方法如class_addIvar, class_addMethod, class_addProperty和class_addProtocol允许重建classes。class_copyIvarList, class_copyMethodList,class_copyProtocolList和class_copyPropertyList能拿到一个class的所有内容。而class_getClassMethod, class_getClassVariable, class_getInstanceMethod,class_getInstanceVariable, class_getMethodImplementation和class_getProperty返回单个内容。&/p&&p&也有一些通用的自省方法,如class_conformsToProtocol, class_respondsToSelector,class_getSuperclass。最后,你可以使用class_createInstance来创建一个object。&/p&ivar&p&这些方法能让你得到名字,内存地址和Objective-C type encoding。&/p&method&p&这些方法主要用来自省,比如method_getName, method_getImplementation, method_getReturnType等等。也有一些修改的方法,包括method_setImplementation和method_exchangeImplementations,这些我们后面会讲到。&/p&objc&p&一旦拿到了object,你就可以对它做一些自省和修改。你可以get/set ivar, 使用object_copy和object_dispose来copy和free object的内存。最NB的不仅是拿到一个class,而是可以使用object_setClass来改变一个object的class。待会就能看到使用场景。&/p&property&p&属性保存了很大一部分信息。除了拿到名字,你还可以使用property_getAttributes来发现property的更多信息,如返回值、是否为atomic、getter/setter名字、是否为dynamic、背后使用的ivar名字、是否为弱引用。&/p&protocol&p&Protocols有点像classes,但是精简版的,运行时的方法是一样的。你可以获取method, property, protocol列表, 检查是否实现了其他的protocol。&/p&sel&p&最后我们有一些方法可以处理 selectors,比如获取名字,注册一个selector等等。&/p&&p&现在我们对Objective-C的运行时有了大概的了解,来看看它们能做哪些有趣的事情。&/p&Classes And Selectors From Strings&p&比较基础的一个动态特性是通过String来生成Classes和Selectors。Cocoa提供了NSClassFromString和NSSelectorFromString方法,使用起来很简单:&/p&&br&&div class=&highlight&&&pre&&code class=&language-text&&Class stringclass = NSClassFromString(@&NSString&);
&/code&&/pre&&/div&&p&于是我们就得到了一个string class。接下来:&/p&&br&&div class=&highlight&&&pre&&code class=&language-text&&NSString *myString = [stringclass stringWithString:@&Hello World&];
&/code&&/pre&&/div&&p&为什么要这么做呢?直接使用Class不是更方便?通常情况下是,但有些场景下这个方法会很有用。首先,可以得知是否存在某个class,NSClassFromString 会返回nil,如果运行时不存在该class的话。比如可以检查NSClassFromString(@&NSRegularExpression&)是否为nil来判断是否为iOS4.0+。&/p&&p&另一个使用场景是根据不同的输入返回不同的class或method。比如你在解析一些数据,每个数据项都有要解析的字符串以及自身的类型(String,Number,Array)。你可以在一个方法里搞定这些,也可以使用多个方法。其中一个方法是获取type,然后使用if来调用匹配的方法。另一种是根据type来生成一个selector,然后调用之。以下是两种实现方式:&/p&&br&&div class=&highlight&&&pre&&code class=&language-text&&- (void)parseObject:(id)object {
for (id data in object) {
if ([[data type] isEqualToString:@&String&]) {
[self parseString:[data value]];
} else if ([[data type] isEqualToString:@&Number&]) {
[self parseNumber:[data value]];
} else if ([[data type] isEqualToString:@&Array&]) {
[self parseArray:[data value]];
- (void)parseObjectDynamic:(id)object {
for (id data in object) {
[self performSelector:NSSelectorFromString([NSString stringWithFormat:@&parse%@:&, [data type]]) withObject:[data value]];
- (void)parseString:(NSString *)aString {}
- (void)parseNumber:(NSString *)aNumber {}
- (void)parseArray:(NSString *)aArray {}
&/code&&/pre&&/div&&p&可一看到,你可以把7行带if的代码变成1行。将来如果有新的类型,只需增加实现方法即可,而不用再去添加新的 else if。&/p&Method Swizzling&p&之前我们讲过,方法由两个部分组成。Selector相当于一个方法的id;IMP是方法的实现。这样分开的一个便利之处是selector和IMP之间的对应关系可以被改变。比如一个 IMP 可以有多个 selectors 指向它。&/p&&p&而 Method Swizzling 可以交换两个方法的实现。或许你会问“什么情况下会需要这个呢?”。我们先来看下Objective-C中,两种扩展class的途径。首先是 subclassing。你可以重写某个方法,调用父类的实现,这也意味着你必须使用这个subclass的实例,但如果继承了某个Cocoa class,而Cocoa又返回了原先的class(比如 NSArray)。这种情况下,你会想添加一个方法到NSArray,也就是使用Category。99%的情况下这是OK的,但如果你重写了某个方法,就没有机会再调用原先的实现了。&/p&&p&Method Swizzling 可以搞定这个问题。你可以重写某个方法而不用继承,同时还可以调用原先的实现。通常的做法是在category中添加一个方法(当然也可以是一个全新的class)。可以通过method_exchangeImplementations这个运行时方法来交换实现。来看一个demo,这个demo演示了如何重写addObject:方法来纪录每一个新添加的对象。&/p&&br&&div class=&highlight&&&pre&&code class=&language-text&&#import
&objc/runtime.h&
@interface NSMutableArray (LoggingAddObject)
- (void)logAddObject:(id)aO
@implementation NSMutableArray (LoggingAddObject)
+ (void)load {
Method addobject = class_getInstanceMethod(self, @selector(addObject:));
Method logAddobject = class_getInstanceMethod(self, @selector(logAddObject:));
method_exchangeImplementations(addObject, logAddObject);
- (void)logAddObject:(id)aobject {
[self logAddObject:aObject];
NSLog(@&Added object %@ to array %@&, aObject, self);
&/code&&/pre&&/div&&p&我们把方法交换放到了load中,这个方法只会被调用一次,而且是运行时载入。如果指向临时用一下,可以放到别的地方。注意到一个很明显的递归调用logAddObject:。这也是Method Swizzling容易把我们搞混的地方,因为我们已经交换了方法的实现,所以其实调用的是addObject:&/p&动态继承、交换&p&我们可以在运行时创建新的class,这个特性用得不多,但其实它还是很强大的。你能通过它创建新的子类,并添加新的方法。&/p&&p&但这样的一个子类有什么用呢?别忘了Objective-C的一个关键点:object内部有一个叫做isa的变量指向它的class。这个变量可以被改变,而不需要重新创建。然后就可以添加新的ivar和方法了。可以通过以下命令来修改一个object的class&/p&&br&&div class=&highlight&&&pre&&code class=&language-text&&object_setClass(myObject, [MySubclass class]);
&/code&&/pre&&/div&&p&这可以用在Key Value Observing。当你开始observing an object时,Cocoa会创建这个object的class的subclass,然后将这个object的isa指向新创建的subclass。点击&a href=&///?target=http%3A///pyblog/friday-qa-.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&这里&i class=&icon-external&&&/i&&/a&查看更详细的解释。&/p&动态方法处理&p&目前为止,我们讨论了方法交换,以及已有方法的处理。那么当你发送了一个object无法处理的消息时会发生什么呢?很明显,&it breaks&。大多数情况下确实如此,但Cocoa和runtime也提供了一些应对方法。&/p&&p&首先是动态方法处理。通常来说,处理一个方法,运行时寻找匹配的selector然后执行之。有时,你只想在运行时才创建某个方法,比如有些信息只有在运行时才能得到。要实现这个效果,你需要重写+resolveInstanceMethod: 和/或 +resolveClassMethod:。如果确实增加了一个方法,记得返回YES。&/p&&br&&div class=&highlight&&&pre&&code class=&language-text&&+ (BOOL)resolveInstanceMethod:(SEL)aSelector {
if (aSelector == @selector(myDynamicMethod)) {
class_addMethod(self, aSelector, (IMP)myDynamicIMP, &v@:&);
return YES;
return [super resolveInstanceMethod:aSelector];
&/code&&/pre&&/div&&p&那Cocoa在什么场景下会使用这些方法呢?Core Data用得很多。NSManagedObjects有许多在运行时添加的属性用来处理get/set属性和关系。那如果Model在运行时被改变了呢?&/p&消息转发&p&如果 resolve method 返回NO,运行时就进入下一步骤:消息转发。有两种常见用例。1) 将消息转发到另一个可以处理该消息的object。2) 将多个消息转发到同一个方法。&/p&&p&消息转发分两步。首先,运行时调用-forwardingTargetForSelector:,如果只是想把消息发送到另一个object,那么就使用这个方法,因为更高效。如果想要修改消息,那么就要使用-forwardInvocation:,运行时将消息打包成NSInvocation,然后返回给你处理。处理完之后,调用invokeWithTarget:。&/p&&p&Cocoa有几处地方用到了消息转发,主要的两个地方是代理(Proxies)和响应链(Responder Chain)。NSProxy是一个轻量级的class,它的作用就是转发消息到另一个object。如果想要惰性加载object的某个属性会很有用。NSUndoManager也有用到,不过是截取消息,之后再执行,而不是转发到其他的地方。&/p&&p&响应链是关于Cocoa如何处理与发送事件与行为到对应的对象。比如说,使用Cmd+C执行了copy命令,会发送-copy:到响应链。首先是First Responder,通常是当前的UI。如果没有处理该消息,则转发到下一个-nextResponder。这么一直下去直到找到能够处理该消息的object,或者没有找到,报错。&/p&使用Block作为Method IMP&p&iOS 4.3带来了很多新的runtime方法。除了对properties和protocols的加强,还带来一组新的以 imp 开头的方法。通常一个 IMP 是一个指向方法实现的指针,头两个参数为 object(self)和selector(_cmd)。iOS 4.0和Mac OS X 10.6 带来了block,imp_implementationWithBlock() 能让我们使用block作为 IMP,下面这个代码片段展示了如何使用block来添加新的方法。&/p&&br&&div class=&highlight&&&pre&&code class=&language-text&&IMP myIMP = imp_implementationWithBlock(^(id _self, NSString *string) {
NSLog(@&Hello %@&, string);
class_addMethod([MYclass class], @selector(sayHello:), myIMP, &v@:@&);
&/code&&/pre&&/div&&p&如果想知道这是如何实现的,可以查看&a href=&///?target=http%3A///bbum//ios-4-3-imp_implementationwithblock/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&这篇文章&i class=&icon-external&&&/i&&/a&&/p&&p&可以看到,Objective-C 表面看起来挺简单,但还是很灵活的,可以带来很多可能性。动态语言的优势在于在不扩展语言本身的情况下做很多很灵巧的事情。比如Key Value Observing,提供了优雅的API可以与已有的代码无缝结合,而不需要新增语言级别的特性。&/p&&p&希望这篇文章能让你更深入地了解Objective-C,在开发app时也能开阔思路,考虑更多的可能性。&/p&&br&--EOF--
原文链接: 文章如下:(读完对OC Runtime有个初步认识) (译)Objective-C的动态特性 这是一篇译文,原文,上一篇文章就是受这篇文章启发,这次干脆都翻译过来。过去的几年中涌现了大量的Objective-C开发者。有些是从动态语言转过来的,比如Ru…
已有帐号?
无法登录?
社交帐号登录
1793 人关注
399 条内容
343 人关注
292 人关注
487 条内容

我要回帖

更多关于 爱思助手下载 的文章

 

随机推荐