我知道HIG(非常方便!),但是在编写Objective-C时,更具体地说,当使用Cocoa(或CocoaTouch)时,您使用什么编程实践呢?
我知道HIG(非常方便!),但是在编写Objective-C时,更具体地说,当使用Cocoa(或CocoaTouch)时,您使用什么编程实践呢?
我已经开始做一些我认为不是标准的事情:
1)随着属性的出现,我不再使用"_"作为"私有"类变量的前缀.毕竟,如果一个变量可以被其他类访问,那么它就不应该有一个属性吗?我一直不喜欢"_"前缀,因为它会让代码变得更难看,现在我可以省略它了.
2)说到私有的东西,我更喜欢将私有方法定义放在.m文件中的类扩展名中,如下所示:
#import "MyClass.h"
@interface MyClass ()
- (void) someMethod;
- (void) someOtherMethod;
@end
@implementation MyClass
为什么要在.h文件中堆满外人不应该关心的东西呢?Empty()适用于.m文件中的私有类别,如果不实现声明的方法,则会发出编译警告.
3)我习惯于将dealloc放在.m文件的顶部,就在@synthesize指令的下面.你取消分配的东西不应该是你在课堂上想要考虑的事情的首位吗?在像iPhone这样的环境中尤其如此.
3.5)在表格单元格中,将每个元素(包括单元格本身)设置为不透明以提高性能.这意味着在所有内容中都设置适当的背景 colored颜色 .
3.6)使用NSURLConnection时,通常您可能希望实现委托方法:
- (NSCachedURLResponse *)connection:(NSURLConnection *)connection
willCacheResponse:(NSCachedURLResponse *)cachedResponse
{
return nil;
}
我发现大多数web调用都是非常单一的,这是一个例外,而不是你希望缓存响应的规则,尤其是对于web服务调用.实现如图所示的方法将禁用响应缓存.
同样有趣的是,Joseph Mattiello(在iPhone邮件列表中收到)提供了一些针对iPhone的好建议.还有更多,但这些都是我认为最普遍有用的(请注意,一些内容现在已经从原始内容中稍加编辑,以包括回复中提供的细节):
4)仅在必要时使用双精度,例如在使用CoreLocation时.确保常量以‘f’结尾,以使GCC将它们存储为浮点数.
float val = someFloat * 2.2f;
当someFloat
实际上可能是一个双精度时,这一点非常重要,您不需要混合模式数学,因为存储上的"val"会丢失精度.虽然iPhone上的硬件支持浮点数,但与单精度相比,双精度运算可能需要更多时间.参考资料:
在老款手机上,假设计算速度相同,但寄存器中的单精度分量可能比双精度分量更多,因此对于许多计算来说,单精度最终会更快.
5) 将属性设置为nonatomic
.默认情况下它们是atomic
,合成后,将创建信号量代码以防止多线程问题.99%的用户可能不需要担心这一点,而且当设置为非原子时,代码的inflating 性和内存效率都会大大降低.
6)SQLite可以是缓存大型数据集的一种非常、非常快的方式.例如, map 应用程序可以将其切片缓存到SQLite文件中.最昂贵的部分是磁盘I/O,通过在 Big Data 块之间发送BEGIN;
和COMMIT;
来避免许多小写操作.例如,我们使用2秒计时器,在每次新提交时重置.当它到期时,我们会发送COMMIT;,这会使您的所有写操作都放在一个大块中.SQLite将事务数据存储到磁盘,这样做可以避免创建许多事务文件,从而将所有事务分组到一个文件中.
此外,如果GUI位于主线程上,SQL将阻止它.如果查询很长,最好将查询存储为静态对象,并在单独的线程上运行SQL.确保将任何修改数据库查询字符串的内容包装在@synchronize() {}
个块中.简而言之,为了方便起见,查询只需将内容留在主线程上.
这里有更多的SQLite优化技巧,虽然文档看起来已经过时了,但其中的许多要点可能仍然不错;
http://web.utk.edu/~jplyon/sqlite/SQLite_optimization_FAQ.html个