记录下,自己的种种过错。
1、快速枚举执行期间,被枚举的集合(包括array、dictionary、set神马的)不能进行修改(添加或者删除元素不可以,只修改内容应该是可以的)
后果:编译器报错,程序崩溃
【教训:最好把需要修改的项目修改后存一个备份下来,在枚举结束后进行统一的增删操作】
2、可变集合(例如array)在addObject的时候,object的retaincount会+1,相应的,remove时也会-1。这个属于内存管理范畴,因为retaincount = 0时,系统会释放掉这个obj,所以,如果它在集合里,想把它移出来,最好先retain一下,防止它被释放掉。用完了记得要相应的release一下。/*坑爹的内存管理,不理解的童鞋要多看一下官方文档里关于ownership这个概念的内容*/
同样,因为remove时候已经-1了,所以一定要理清关系,防止overrelease(过度释放,这可是要引起crash导致程序崩溃滴~比leak还让人抑郁,你懂得)
后果:可能会导致leak或者crash,后者发生,程序崩溃。
【教训:记得add跟remove时候默认会有相应的retaincount变化,跟随内存管理原则操作,顺便,添加或者移除子视图也是这样滴~子视图的retaincount会反生相应变化,小幻当年一度overrelease啊,桑心~】
3、关于特性中的内存管理原则,声明特性时会有相对应的内存管理规则(retain-调用setter方法时将newObj 进行retain操作,copy-赋值时进行copy操作,asign-直接对指针赋值,retaincount不会变化,readonly-没有setter方法),赋值时使用点操作符会根据情形相应的调用getter跟setter方法,符合内存管理原则。
但是不使用点操作符或者调用getter跟setter方法的,也就是直接的指针赋值不符合内存管理原则,比如把一个字符串的指针赋给另一个,这种做法不提倡,赋值前需要手动把原来的空间release,比较容易出错。
后果:内存管理出故障,debug时会想弄死不好好编程序的自己。
【教训:使用getter和setter方法对成员变量进行操作是符合面向对象原则的,OC是一门面向对象的类C语言,如果不是大牛,请严格按规则编程】
4、我经常容易混淆的一点:使用特性时,@property关键字声明的是getter方法,@synthesize关键字则负责通知编译器自动按声明属性实现getter跟setter方法,手动实现的getter跟setter方法会按照重写规则覆盖编译器自动生成的那部分。
后果:没啥后果,简化coding过程而已
【教训:此条意在告诉自己,声明特性后,可依然根据自己需求重写个别getter跟setter方法,灵活,简便,以及提醒自己,getter跟setter可以不仅仅是简单的赋值,还可以进行其他逻辑操作滴~斯坦福大学的例子里,执行getter方法的时候计算了obj的年龄,从而判断obj有无投票权利,给出对应返回值】
5、有时候下下来的sample不好用不一定是SDK的问题,也有可能是Target的问题,生成新的Target就好。新的Target可以制定新的链接库,编译资源等等,有不同库调试任务,或者不同资源调试任务的时候,用多Target是一个不错的选择
后果:无
【教训:感觉不仅仅是这么用的,真正的含义尚未发掘,学习中~】
6、所有的集合中,只有数组是有序的,其他都是无序的
后果:希望有序存储的时候需要注意,视图用dictionary存储排序后的列表,结果杯具了
【教训:学习时一定注意这些小细节,否则coding的时候就会得到很坑爹的结果~】
7、如果应用程序有自定义结构的信息文件什么的,更新版本时结构若发生改变,一定记得要设定一个标志位用来检测是否需要删除原有的信息文件。苹果商店在更新应用的时候是不会自动删除document下已存在的文件的。
后果:正确的程序读取了错误结构的数据,会发生什么事情呢,just imaging~
【教训:更新新版本的时候尽量要删除原有的文件】
8、写函数或者写模块的时候,谨记低耦合高内聚原则
后果:不说了,自己翻软件工程的课本去吧
【教训:课本上的东西看上去挺没用的,代码写多了你就知道,自己当时的想法有多2,有多2~!!!全局变量就是用来存数据,标志位,函数内部不要用全局变量,不要啊,不要啊~看看我欠揍的没经验的代码,我就羞愧】