我知道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

Ios相关问答推荐

使用音频单元播放音频流,出现爆裂声

在Swift5中,将某些属性值从一个类复制到另一个类实例

在SwiftUI中动态隐藏列表的空部分

Swift在SceneKit中为scnnode添加自定义几何体(视图)

当S没有身体时该如何处理

withTaskGroup不适用于CLGeocoder

swiftui 图像放大时无法正确拖动

如何解决错误 HE0004:无法在 Visual Studio 2022 中加载框架ContentDeliveryServices

使用 SwiftUI 显示多个 VNRecognizedObjectObservation 边界框时偏移量错误

在我的 M1 上出现 Architecture arm64 问题,因此我无法运行我的旧项目

iOS - 判断开发者模式是否开启 (Swift)

滚动 swiftUI 列表时,未调用单元格的任务修饰符.怎么修?

如何让替换视图淡入旧视图而不是交叉淡入淡出?

Swift 5.7 - 使存在的任何协议符合 Hashable

ARKit vs. ARCore vs. Vuforia vs. D'Fusion Mobile vs. Layar SDK

如果已安装,则重定向到应用程序,否则重定向到 App Store

iTunes Connect 中的无限制 Web 访问是什么意思

请在您的 Podfile 中为此目标指定一个平台?

如何在 Swift 中更改按钮标题对齐方式?

如何为 iOS 13 的 SF Symbols 设置权重?