首页
学习
活动
专区
工具
TVP
发布

nimomeng的自我进阶

搞过前端,做过移动,玩过服务器。学过摄影,磕过英语,待过BAT。还在路上。
专栏作者
35
文章
64913
阅读量
14
订阅数
苹果小程序App Clips技术解析和展望
北京时间2020年6月23日,苹果在一年一度的WWDC上正式宣布了苹果官方“小程序” App Clips。本文带你来了解App Clips,分析其优缺点,并对前景做展望。
nimomeng
2020-07-02
2.2K0
基于CocoaPods的组件化原理及私有库实践
智人能在残酷的进化大战中存活下来,原因之一就是智人懂得将知识沉淀成外物,辅助彼此之间的合作,从而使得整个群体产生了规模效应,即1+1>2的效果。 从一个角度上说,石器时代是基于石器的组件化的时代,因为老张家的石矛(或其它石头利器)借给了老王,一样可以拿去狩猎。要想实现这个目的,一定要保证:
nimomeng
2019-03-04
4.7K0
ViewController官方文档
UIWindow *window = [[UIWindow alloc] initWithFrame:[UIScreen mainscreen] bounds]; levelViewController = [[LevelViewController alloc] init]; window.rootViewController = levelViewController; [window makekeyAndVisible];
nimomeng
2019-02-25
3.2K0
你真的了解MVC吗
提到MVC,你会想到什么?三层架构?设计模式?JSP?老掉牙?面相对象制造器? 先来听个故事吧。
nimomeng
2019-02-25
5680
探索命名之美(一)
很多新码农在工作中总会被老鸟批评程序命名的陋习,我也被批评过很多次。痛定思过,我决定要研究应该怎么命名,为什么要给函数一个好的命名很难,应该怎么样给函数命名。
nimomeng
2018-09-13
5090
《结网》读书笔记
天使投资者总结的三大问题: 产品概念是否处于趋势上,是否在满足强需求和频发需求? 是否找到了有效的突破口,突破之后如何建立壁垒? 团队能力与产品概念是否匹配? 用户的历史行为比他们当前的意愿更具有价值 对于不确定的交互设计,可用性测试是将其确定下来的非常有效的方法。主要有三个步骤: 寻找一些由代表性的、符合产品潜在用户条件的用户。 请这些具有代表性的用户在产品或产品原型上完成一些任务。 使用体验观察室观察它们的操作。 用户体验三要素:别让我等、别让我想、别让我烦 如果有用户访问你的网站,最好能在10秒内
nimomeng
2018-09-13
5300
《Don't Make Me Think》读书笔记
Don't make me think 别让我思考,是可用性的第一定律。 如果你不能做到让一个页面不言而喻,那么至少应该让它自我解释。 第一个事实:我们不是阅读,而是扫描。 我们一般会把注意力放在这样的文字和短语上: 与手头任务有关的 我们当前或接下来的个人兴趣 我们脑海里一些根深蒂固像触发器那样的词 第二个事实:我们不作作家选择,而是满意即可 为什么用户不寻找最佳选择: 我们总处于忙碌中。“寻找最佳策略很难,需要的时间也很长,满意策略效率更高” 如果猜错了,也不会产生什么严重的后果 对选择进行权衡并不
nimomeng
2018-09-13
8770
《Objective C编程》笔记
1.为什么main()总是返回0?可以将main()的返回结果视为“粗欧文报告”,这样0就是好消息,没有错误就是成功。 2.消息:消息发送(指令)必须写在一对括号中,并且必须包含以下两个部分。 指针,指向接收消息的对象。 方法名,要触发的方法的方法名。 3.如果在编写程序时,如声明指针时,不知道所指对象的准确类型,为此可以使用id类型。id的含义是:指针,并可以指向任意类型的Objective-C对象,e.g.: id delegate 注意:以上声明没有用星号。id已经隐含了星号的作用。 4.在obj-c中,创见对象最常见的途径就是使用alloc和init,通常会将这两个消息写在一行代码中,并以嵌套的形式连续发送(Apple推荐写法): [[NSDate alloc] init]; 5.合并存取属性的便捷方法: 在.h中国,通过@property声明属性,如 @property int w; 在impl中,要求编译器根据@property声明自动合成(synthesize)出存取方法。如: synthesize w; 6.方法前的-号表明此方法为实例方法,必须通过new才能使用; 方法前的+号表明此方法为类方法,是静态方法,无需new也能使用。 7.相互拥有的所有权关系导致相关的对象都无法被释放。这种情况称之为“retain循环”(retain cycle)。retain循环是导致内存泄露的常见原因。 8.使用弱引用(weak reference)可以解决retain循环问题。弱引用是不主张所有权的指针。 如: @interface Asset:NSObject { __weak Employee *holder; } @property (weak)Employee *holder; 9.当某个由弱引用所指向的对象被释放时,相应的指针变量会被归零,即赋为nil。 10.retain计数规则。 前提:“你”代表“当前正在使用的某个类实例”。 a.如果用来创建对象的方法,其方法名是以alloc或new开头的,或者包含copy,那么你已经得到了该对象的所有权(即可以假设该新对象的retain计数时1,且该对象不在NSAutoreleasePool对象中。)你要负责在不许要使用该对象的时候释放之。以下时部分常见会“传输”所有权的方法:alloc(后会跟一个init方法),copy和mutableCopy。 b.通过任何其他途径创建的对象(例如便捷方法),你是没有所有权的(可以假设新对象的retain计数是1,而且该对象已经在NSAutoreleasePool对象中。如果没有保留该对象,那么当NSAutoReleasePool对象被“排干”时,这个对象就会被释放。) c.如果你不拥有某个对象,但是要使用该对象的时候,可以向其发送release消息或者autorelease消息(release会使retain计数立刻减1。autorelease会导致,当NSAutoreleasePool对象被排干时,再向相应的对象发送release消息)。 d.只要对象还有至少一个拥有方,该对象就会继续存在下去(当该对象的retain计数到达0时,就会收到dealloc消息)。 11.内存管理,需要经常从局部角度来思考问题,并且以类为分界线,考虑内存管理问题,而不是去考虑应用的其他部分时怎么样处理某个对象的。 12.为什么需要一个不能修改的数组NSArray呢?原因有二: a.保证数组内容的安全。也就是说,程序在使用NSArray对象时,只能“看”不能“改”。 b.性能考虑。不可修改对象永远无需拷贝。NSArray的copy方法其实不会做任何额外的工作,仅仅返回指向自己的指针而已。而NSMutableArray的cpy方法则会制作一份自己的拷贝,并返回指向新数组对象的指针。 13.NSSet的对象是无序的,所以不能通过索引来访问。只能向NSSet对象查询某个对象是否存在,它有一个名为containObject:的方法。 14.在Apple提供的类中,有些覆盖了isEqual:方法。对于这些类,相等的(equal)和相同的(identical)是两个概念。假如程序有两个指向NSString对象的指针: NSString *x = … NSString *y = … 如果x、y保存的是完全一样的地址,则称这两个变量是“相同的”。如果x和y所指向的NSString对象包含的是相同的字符,并且排列顺序也一样,则称这两个变量是“相等的”。因此,相同的变量一定是相等的,但是相等的变量不一定是相同的。 15.C、C++、Objective-C这类语言的代码文件要经过两步才能完成编译。首先,预处理器(preprocessor)会读入并处理整个文件。接着,预处理器的输出结果会作为输入
nimomeng
2018-09-13
5750
《Objective-C基础教程》笔记
1.xcode中,oc的.m文件代表message,指的是Objective-C的一个主要特性。 2.NS前缀的来历要追溯到次公局包还被成为NextStep,而且是Next Software公司时。 3.双引号前有一个@符号,这表示引用的字符串应该作为Cocoa的NSString元素来处理。 4.编译器使用“基地址加偏移”机制实现奇妙的功能。给定的对象基地址,是指第一个实例变量的首个字节在内存中的位置。通过在该地址加上偏移地址,编译器就可以查找其他实例变量的位置。 5.不要将get作为getter方法的前缀。因为get在Cocoa中有特殊的含义。如果get出现在Cocoa方法名称中,就意味着这个方法会通过你当做参数传入的指针来返回数值。 6.导入头文件有两种不同的方法:使用引号或者使用尖括号。带尖括号的语句用来导入系统头文件,带引号的语句则说明导入的是项目本地的头文件。也就是说,如果你看到的头文件名是尖括号,则这个头文件对你来说是只读的;如果头文件被双括号包围,则你可以编译它。 7.@class创建了一个前向引用。就是在告诉编译器:“相信我,以后你会知道这个类到底是什么,但是现在,你只需要知道这些。”如果有循环依赖关系,@class也很有用。即A类使用B类,B类也使用A类。如果试图通过#import语句让这两个类相互引用,那么最后就会出现编译错误。如果在A.h中使用@class B,在B.h中使用@class A,那么这两个类就可以相互引用了。 8.如果有些类型使用C的struct而不是对象,一定是因为性能。程序(尤其是GUI)会用到许多临时的点、大小和矩形来完成他们的工作。所有的Objective-C对象都是动态分配的,而动态分配是一个代价较高的操作,它会小号大量的时间。因此将这些结构创建成第一等级的对象会在使用过程中增加大量的系统开销。 9.比较两个字符串是否相等时,应该用isEqualToString:,而不是仅仅比较字符串的指针值。例如: if([thing1 isEqualTOString: thing2])和if(thing1 == thing2)是不同的。因为==运算符只能判断thing1和thing2的指针数值,而不是他们所指的对象。由于thing1和thing2是不同的字符串,所以第二种比较方式会认为他们是不同的。 有时,我们想检查两个对象的标识:thing1和thing2是同一个对象吗?这是就应该使用运算符==,如果想查看等价位(即这两个字符串是否代表同一个事物),那么请使用isEqualToString。 10.编译器和苹果公司都已下划线开头的形式保存实例变量名称,如果你尝试在其他地方使用下划线,可能会出现严重的错误。这条规则实际上不是强制的,但是如果不遵循它,你可能会遇到某种风险。
nimomeng
2018-09-13
4300
《产品体验要素》读书笔记
无论是功能型产品还是信息型产品,战略层关注的内容都是一样的——来自企业外部的用户需求。我们必须了解这些观众想从我们这儿得到什么,还要知道他们想达到的这些目标将怎样满足他们所期待的其他目标。 雨用户需求相对应的,是我们对APP的期望目标。这些产品目标可以是商业目的,或是其它类型的目标。
nimomeng
2018-09-13
6480
Objective-C官方文档
@property(getter = isFinished) BOOL finished;
nimomeng
2018-09-13
1.5K0
Error handling官方文档
Domain有很多用途。当检查错误时,塔给出Cocoa程序一种鉴别MacX 子系统的参考。它也帮助区分不同子系统之间的错误码。而且,它提提供了错误码之间的一种松散的关系,比如NSOSStatusErrorDomain也许是NSMachErrorDomain错误中的一种。 Error的userInfo中,存储自定义字符串。用途如下: a) Error description:错误的主要描述。 b) Failure reason:简单的描述错误发生原因。 Error object和excepti
nimomeng
2018-09-13
1.1K0
Collection官方文档
a) Keys必须实现NSCopying协议。添加成员的方法并不将每一个key直接进行添加,而是将每一个key进行copy并将copy后对象添加到dictionary中。在添加到dictionary之后,自有的keys的copy对象不能被修改。 b) Keys还必须实现hash和isEqual方法,因为dictionary使用了hashTable来组织存储,并且进行快速访问。并且,dictionary的高性能严重依赖了hash方法。 c) 虽然可以用任何使用了NSCopying协议并继承了hash、isEqual方法的对象,但是最好不要使用large Object来做key,比如NSImage等等,因为这样会损耗性能。
nimomeng
2018-09-13
2K0
Block官方文档
a) 像函数一样有定义好的参数 b) 有返回值 c) 能从定义的作用域中捕获状态(值) d) 可以修改作用域状态(值) e) 可以和统一作用域下的其它blocks共享值的变化 f) 能够在作用域(栈)被destroy后继续分享或者修改作用域
nimomeng
2018-09-13
1.6K0
OC优化指南
a) Reusing UITableViewCell:利用cellWithTableView:cellIdentifier:nibName: b) Reusing Images/ Cache Data:imageNamed做了个很重要的事情:此方法cache了图片。但是这种方法只能从bundle里取出图片,即,不可以通过此方法从网络下载或者本地加载。其他方法,诸如[UIImage alloc] initWithContentOfFile:]或者 [UIImage alloc] initWithData] 则不会自动cache数据 c) 减少准备时间,在展示前将数据准备就绪 d) 善用DrawRect方法,速度比通过nib读取或者addSubView方法快很多,原因在于drawRect是GPU方法,而GPU方法在渲染或者显示UI时更快。 e) 切记设置自定义View的backgroundColor为white,默认为black f) 如果app有太多的子类或者一个复杂的结构,考虑通过代码来draw,让GPU来加速过程 g) Cache the hight。因为如果计算hight的过程很慢,则会影响tableView的渲染 h) Opaque。如果一个View是透明的,则iOS需要在一个像素上渲染两次或多次,因为一个像素在那时候属于多个view。请设置opaque为YES i) 尽量降低Graphical Effects
nimomeng
2018-09-13
7710
View官方文档
Window是UIWindow class下的实例并且处理了总体的application的UI的展现。大部分来说,app的window不会有变化。 View是在CALayers之间的连接处工作,去渲染和变换view的内容。所有UIKit的view背后都有一个layer对象(通常是CALayer 的class),这些layer对象是存储views和处理view相关的动画。 CALayer对象的作用对性能有很大的提升。实际view对象的drawing代码调用越少越好,并且当代码被调用,结果会被Cor
nimomeng
2018-09-13
2.4K0
《设计原本》读书笔记
两人互动产生的思想是原来的两倍,原创性思想也是原来的两倍,同时也增加了快乐,导致试验对象去尝试更困难的任务。
nimomeng
2018-09-13
5350
高级内存管理指南
好的习惯可以防止内存相关的问题 a) 在反复使用同一个数据时释放掉或者覆盖掉。 b) 当数据不再被使用时如果不释放掉,会造成内存泄露。 基本的内存管理准则: a) 你拥有你创建的任何对象的管理权。诸如:alloc,copy,new,mutableCopy, 等待创建的对象适用此规则。 b) 使用了retain的对象你需要管理。 在以下两种情况下你要使用retain: i. 实现了访问方法,或者一个init方法; ii. 保证一个对象不被其它操作引起失效
nimomeng
2018-09-13
3640
NSBundle官方文档
main bundle表示正在运行的app中所包含的code和resources。如果你是app开发者,这个是最常用的bundle。main bundle也是最简单获取的bundle因为它不需要提供任何信息。
nimomeng
2018-09-13
2.3K0
OC编程笔记
[immutableObject copy]//浅copy [immutableObject mutableCopy]//单层深copy
nimomeng
2018-09-13
6370
点击加载更多
社区活动
腾讯技术创作狂欢月
“码”上创作 21 天,分 10000 元奖品池!
Python精品学习库
代码在线跑,知识轻松学
博客搬家 | 分享价值百万资源包
自行/邀约他人一键搬运博客,速成社区影响力并领取好礼
技术创作特训营·精选知识专栏
往期视频·千货材料·成员作品 最新动态
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档