献给iphone开发的同仁们,同时也给自己做个笔记

192个加分的回答:

有些初学时的做法,现在我认为是不标准的。

1) 有了property,在“私有”的成员变量前面不再使用"_"前缀。如果一个成员变量可以被其他的类访问,那就应该用property。我不喜欢“_”前缀,它会把代码弄得非常丑陋,现在终于可以不用它了。

2) 说起来私有,我倾向于把似有方法定义在.m文件里,放在一个私有的category内,如下:

  1. #import "MyClass.h" 
  2.  
  3. @interface MyClass () 
  4. - (void) someMethod 
  5. - (void) someOtherMethod 
  6. @end 
  7.  
  8. @implementation MyClass 

Why clutter up the .h file with things outsiders should not care about(这句怎么翻译说不准)?.m文件里的空括号的作用是私有category,如果你不实现里面声明的方法,会引发编译警告。

3) 我把dealloc方法放在.m文件的顶部,紧挨着@synthesize语句。需要dealloc哪些东西,难道不应该是你考虑一个类的时候的首要问题么?尤其是在iPhone这种环境下。(译注:我也是这么做的,dealloc和init之类的放在一起,可以对照。默认的模版把dealloc放在最后面,不利于对照,也容易让人忽视dealloc)

3.5) 在table cell里,为了性能令所有的元素不透明(包括cell本身)。也就是说,每个东西都设置恰当的背景色。

3.6) 使用NSURLConnection时,你应该实现下面的delegate方法

  1. - (NSCachedURLResponse *)connection:(NSURLConnection *)connection 
  2.                   willCacheResponse:(NSCachedURLResponse *)cachedResponse 
  3.       return nil; 

除非你希望缓存response,否则你大多数时候会觉得web调用都是反常的,尤其是web service调用。如上实现这个方法可以避免缓存任何的response。

4) 避免double。iPhone原生不支持任何的double精度运算。它们是使用库来模拟的。仅在你必须使用的时候使用double精度,例如CoreLocation。在数字常数后面使用f后缀,令编译器把它们当作float处理。

  1. float  val  =  someFloat  * 2.2f; 

更重要的是当someFloat是double的时候,你不需要混合精度计算,因为val已经把精度损失掉了。更新:在3GS上发生了些变化,更应该用float了:

http://stackoverflow.com/questio ... float-on-the-iphone

即使在某些手机上看起来计算不同精度速度一样,但是float可以放更多数据在寄存器里,所以还是会快很多。(译注:程序不是计算为主的,就不必那么在乎了。)

5) 把property设置为nonatomic。atomic是默认值,是同步的,会自动加入同步代码避免在多线程时发生问题。但是99%的情况下,你的property不会在多线程环境下访问,用nonatomic可以避免代码臃肿提高效率。(译注:也就是说如果要在多线程环境下访问property,切记用atomic,或者自行加锁)

6) SQLite保存大数据集非常非常快。例如地图程序应该把图块缓存在SQLite里。最昂贵的部分是硬盘I/O。要避免在大块之间产生大量的小的写入,就需要用BEGIN; 和COMMIT;。我们使用2秒钟的计时器去重置每次新的提交。一旦计时器国企,就发送COMMIT;,这样所有些操作就写到一个大块里面了。SQLLite把事务数据保存在磁盘上,使用Begin/End包装可以避免产生大量的事务文件,把所有的事务写到一个文件里。

当SQLite在主线程的时候会阻塞你的界面。如果你执行非常长的查询,一个好办法是把你的查询保存成静态对象,然后在另一个线程查询。把所有会修改数据库的查询用@synchronize() {}块包起来。短查询就放在主线程,简单方便。(译注:我在多线程里面使用SQLite的方法更简单,用sqlite3_open_v2打开数据库,flag用SQLITE_OPEN_FULLMUTEX,这样SQLite的所有函数就是线程安全的了,不需要synchronize了,不过哪个效率更高,我不知道。)

更多SQLite优化技巧在此,虽然文章很老,但是观点貌似都还对:

http://web.utk.edu/~jplyon/sqlite/SQLite_optimization_FAQ.html

61个加分的回答:

以前outlet的内存管理没什么好办法。现在的最佳实践是把outlet声明为property:

  1. @interface MyClass :NSObject { 
  2.  
  3.     NSTextField *textField; 
  4.  
  5. @property (nonatomic, retain) IBOutlet NSTextField *textField; 
  6. @end 

使用property,内存管理语义更清晰;同时给其他的实例变量组织提供了一个统一的模式。

译注:这条值得商榷,一般来说不需要跨类存取的变量,是否是IBOutlet,我都认为尽量不要声明为property。这篇问答比较早,有很多信息也许不够新了。翻出来主要是给大家参考的。

57个加分的回答:

使用LLVM/Clang静态分析器:

原文我不翻译了,最近的Xcode版本都已经内置包含了LLVM/Clang静态分析器,使用方法很简单:

  Xcode3系列使用热键Shift+Command+A

  Xcode4系列使用热键Shift+Command+B

为了保证效果,使用静态分析器前,最好Shift+Command+K清除一下Build。

静态分析器可以分析出很多滥用,不和规范的用法,特别是能够帮你找到潜在的内存泄漏。但是它不是万能的,如果你的代码逻辑很乱,尤其是内存管理大量都不符合规范,那么它也可能给出错误的建议。它的建议起作用的前提是,你大量的代码都符合Objective-C和Cocoa的规范,有少部分代码忘记了release之类的,那么它会给你很好的建议。

所以,永远都没有神仙皇帝,好好写代码是基础。

另外一个57个加分的回答

使用标准的Cocoa命名和格式规范以及术语。规范的好处是和别的Cocoa开发者合作的时候,更方便。

例如,应该做和不应该做的:

*  在对象的interface里不要声明id m_something,不要把它叫做成员变量或者字段;使用something或者_something(这个现在也不建议了)作为它的名字,叫它实例变量。

* getter不要叫-getSomething;应该为-something;。

* setter不要叫做-something;应该叫-setSomething:。

* 方法名由参数和冒号组成;形如-[NSObject performSelector:withObject:]而不是NSObject::performSelector。

* 方法名,参数,变量,类名使用驼峰式命名(由多个单词组成一个名称时,单词首字母大写,单词间无空格,无下划线)。

* 类名首字母大写,变量,方法名首字母小写。

不管怎么做,绝对不要用Win16/Win32风格的匈牙利命名法。即使微软在转向.NET平台时,也都抛弃了它。

转载于:https://www.cnblogs.com/yingkong1987/archive/2012/12/09/2810121.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/422060.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux 编译多个文件,linux gcc编译多个源文件的方法

华为荣耀6 H60-L02/L12(联通版)救砖包【适用于无限重启】本帖最后由 HOT米粒 于 2014-11-16 20:43 编辑 华为荣耀6 H60-L02/L12(联通版)救砖包[适用于无限重启]说明: 1.本工具包用于华为荣耀6 H60-L02(联通版): ...CMS本质上是什么2015-121.数据可以任意取和构造,结构也…

uboot(一)

BootLoader指系统启动后,在操作系统内核运行之前运行的一段小程序。通过BootLoader,我们可以初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核准备好正确的环境。通常…

linux+默认监听+目录,C# 时时监听目录文件改动

C# 时时监听目录文件改动:public static class DirectoryListen{public static string CountListXmlPath CountCore.CountListXmlPath;public static string DirectoryListenPath CountCore.ListenerAssemblyDirectory;[PermissionSetAttribute(SecurityAction.Demand, Name …

计算机简介

一、计算机简介: 1、计算机系统组成:软件和硬件,二者紧密相关,缺一不可 1.1硬件:计算机系统的物质基础,软件的载体 1.1.1硬件系统:主机(中央处理器(CPU,一般CPU由计算器和…

前端学习(612):js的三种书写位置

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title><!--外部js写法--><…

linux内核 task cmd,linux内核

标签&#xff1a;1. 常见内核参数内核参数一般在/proc/sys 目录中临时改变某个系统参数的值&#xff0c;可以用两种方法来实现,如1) echo 1 > /proc/sys/net/ipv4/ip_forward2) sysctl -w net.ipv4.ip_forward1以上两种方法都可能立即开启路由转发功能&#xff0c;但如果系统…

分布式文件系统虚拟目录及命名空间的实现方法

分布式文件系统虚拟目录及命名空间的实现方法 http://www.doc88.com/p-717876372220.html 可以读一下&#xff0c;讲得还算清楚 转载于:https://www.cnblogs.com/hengli/archive/2012/12/12/2814342.html

Linux编译dhcpd,linux中搭建dhcpd服务器

这一次咱们来共同看一看如何在linux中搭建dhcp服务器&#xff1a;首先呢dhcp服务分为客户端IP地址动态分配服务和dhcp中继服务&#xff0c;小编在这里用linux系统搭建一个为客户端动态分配IP地址的dhcp服务器&#xff0c;dhcp中继就在路由器上做了(小编用了一台华为路由器R2621…

一张图说明我们为什么要关注 HTML5

转载于:https://www.cnblogs.com/h5rocks/archive/2012/12/12/2814692.html

linux自动读取麦克风,检测用户向麦克吹气

如果几年前你告诉我人们可以通过晃动手机或向麦克吹气使手机有所动作&#xff0c;我一定会大笑不止。但现在这已经是事实了。检查晃动动作是很直接的&#xff0c;所有这些在3.0“motion event”(动作事件)中都有介绍。检测向麦克吹气困难一点。本教程将建立一个简单的单视图程序…

动态绑定 datagridview

//绑定该邮箱到datagridviewint index this.dataGridViewSendEmail.Rows.Add();DataGridViewRow row this.dataGridViewSendEmail.Rows[index];row.Cells[1].Value emailAddr;row.Cells[2].Value "正常";row.Cells[3].Value DateTime.Now.ToString("yyyy-M…

linux中端口的欺骗,Linux中的端口占用问题

本文将会阐述两种解决端口占用的方法。本文会用到的服务器端的程序如下&#xff1a;1 #include "unp.h"2 #include 34 int main(int argc, char **argv)5 {6 intlistenfd, connfd;7 socklen_t len;8 structsockaddr_in servaddr, cliaddr;9 charbuff[MAXLINE];10 tim…

oracle维护常用SQL语句(查看系统表和视图)

转:http://www.360doc.com/content/11/1230/15/7489308_176090474.shtml oracle维护常用SQL语句(查看系统表和视图) 1.查看表空间的名称及大小 select t.tablespace_name, round(sum(bytes/(1024*1024)),0) ts_size   from dba_tablespaces t, dba_data_files d   wher…

Asp.net 调用mysql存储过程参数传中文乱码!

<add name"xxx" connectionString"server10.10.xx.xx;User Idxxx;passwordxxxx;databasexxxx;Port3306;character setutf8;"/> 在web.config中进行编码设置&#xff1a;character setutf8; 调用存储过程方法&#xff1a;MySqlCommand cmd new MySql…

手机内存卡转化linux,Android 往手机内存卡上存储用户名与密码的操作

当大家 用Android 应用 操作时&#xff0c;会发现有很多应用要登陆名和密码&#xff0c;而且&#xff0c;它们都能记住密码&#xff0c;当你退出 &#xff0c;再次登陆时&#xff0c;你们帐号密码会自动添加上去。例&#xff1a;布局文件 相信都能做出来 就不一一介绍 了。下面…

Mplayer 音频解码分析

一.序 还是按部就班的来&#xff0c;这次主要分析一下Mplayer中音频解码流程&#xff0c;特别说明一下&#xff0c;这里 的音频解码包括后面会说的视频解码统统不涉及到具体的格式和解码算法&#xff0c;如果大伙对具 体文件格式和解码感兴趣可以在网上找相关资料看看~也可以留…