日期:2011.04.29
日期:2011.05.26
日期:2011.06.09
日期:2011.06.16
日期:2011.06.27
日期:2011.06.29
日期:2011.08.26
*自定义的类型,进行传递的时候,尽量使用retain的方式。否则,每次使用copy
的方式,每次添加新的变量,都要更新copy协议的内容, 很麻烦。
*成员变量的访问函数,最好不要处理的很复杂,尽量使用系统的就可以了。如
果需要复杂的操作,那么最好是使用 另外一个函数名和函数。例如,对于
MediaFile的attachment的set函数,因为要自动的根据1024*768缩放,因此重写了
系统的行为。但是,后来又要求对于来 自相机的要进行960*768的缩放,因此要
针对另外一个变量mIsComeFromCamera来决定行为。这样,在NSCopy协议的函数中
就引起问题了。
总之,如果操作另类的话,还是单独做个函数吧。
*UI的切换销毁等等,经常由于切换过快导致异常。其原因常常是,A页面在Load数据,但是还没有Load完,但是,由于页面切换,导致A页面被释放了。而后,ALoad完毕数据之后,进行页面更新,导致访问异常。
正常来说,应该不会出现这种情况,比如,在Load的时候锁死页面不允许切换,或者开启另外的线程进行切换,但是处理好对象的引用。
但是,实际上可能不会那么完美,很可能在你下载数据之时和锁死页面之间,用户的快速操作,导致了A的释放。
一个比较好的方法是:使用一个数组保存要释放对象,然后定义一个timer,每10s或30s进行一次操作,删除已经被废弃很久的对象。
当然,保存的时候,要保留当时的时间,用于比对。
*UITabBarController的UITabBarItem的标题通常可以在xib中设定。但是有时候发
现,当点击某个index后,该 index的标题变化了。这是因为,这个index的标题是
会根据当前ViewController的title变化的,因此如果你在代码中设定 了
viewcontroller的self.title = @"xxxx",那么标题就会变为xxxx。
如果你希望VC的title和item的title不相同,那么不要使用self.title而使用:
self.navigationController.navigationBar.topItem.title = @"My Title";
*NSOperationManager最好不要同时存在多个。因为,如果同时存在多个,则
**不能控制线程数量。
**相同的请求无法取消了。比如,恰好有2个请求相同图片的请求,则很可能两个Manager同时请求服务器,导致多出一次请求。并且,因为命名,位置等等原因还可能产生bug。
**Op的优先级也无法保证了。
*网站客户端软件中,如果要有持续化的操作的话,则一定要持续话最终的内存数据,而不要直接缓存网络请求的返回内容(通常是个Json值)。
因为一旦这么做了,那么会产生一些问题。众所周知,网站客户端软件比普通的Safari网页的优势在于:
1,暂时不需要看到的内容可以暂时不下载,即使是在一个页面中,例如爱拍动态页面的各个图片,只有下载看到时,才会下载。
2,如果只更新了部分内容,如评论信息,则不需要更改全部页面,只需要更改某条记录即可。
3,如果删除了某些内容,则也不必重新下载全部页面。
综上,也就是说,在最初返回的缓存内容之后,用户很可能会进行一些修改和删除等操作,如果直接缓存Json值,则导致这个数值并不是最后的结果。
*用关键字__weak来标记弱指针更好。虽然它在iphone开发中没有作用。
__weak CPTAnnotationHostLayer *annotationHostLayer;
*加入第三方库的头文件的方法是:
1,定义一个User-Defined,例如:CORE_PLOT_HOME,
2,然后,在Search Paths中的Header Search Paths中使用 $(CORE_PLOT_HOME)/framework 字样。这样显得更加专业。
*UIViewController的初始化函数放在一个单独的函数中,例如- (void)setupView,然后在- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil和- (void)awakeFromNib中分别调用setupView。
*如果导航工程,且没有title,则只要设定一个back item,则它会一直存在。很奇怪。
UIBarButtonItem *backBarButtonItem = [[UIBarButtonItem alloc] init];
backBarButtonItem.title = @"Back";
self.navigationItem.backBarButtonItem = backBarButtonItem;
[backBarButtonItem release];
但是,对于left和right,则不是这样。
*在Navibar上放置一个按钮。同时,保持和Navibar的风格一致。
以前我都是使用UIButton。
不过,今天看到的代码是,先放到一个ToolBar上,然后把整个ToolBar放到NaviBar上。这样风格可以一致。还不错。
目前我发现的好处是:
1,点击的时候,会有ToolBar的很绚丽的高亮效果。
2,风格和NaviBar会一致。
3,图片会很高亮。比图片本省的亮度要高。
代码如下:
UIToolbar* toolbar = [[[UIToolbar alloc] initWithFrame:CGRectZero] autorelease];
toolbar.barStyle = self.navigationController.navigationBar.barStyle;
NSMutableArray* buttons = [[[NSMutableArray alloc] initWithCapacity:2] autorelease];
UIBarButtonItem *loginButton = [[[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"xxxx.png"]
style:UIBarButtonItemStylePlain
target:self action:@selector(doLogout)] autorelease];
[buttons addObject:loginButton];
[toolbar setItems:buttons animated:NO];
CGFloat toolBarHeight = self.navigationController.navigationBar.bounds.size.height;
toolbar.frame = CGRectMake(0, 0, 35, toolBarHeight + 0.01);
// Put the toolbar in the nav bar
self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:toolbar];
[self.navigationController.navigationBar setNeedsDisplay];
* NSObject的+ (void)load函数,在该模块被load进入系统时,会调用一次。Category也会调用一次。详情参见SDK。
可以根据这一点,将某些相关的类注册到一个全局类中,然后进行一些操作。
==========FIL代码经验============
* 代码和通用的库分别放在不同的目录下,隔得很远,而非放在同一个目录下。这样,给人的感觉,它们是独立开发的。 但是当下载的时候,使用一个脚本文件(sh文件),将它们下载到同一个目录下,然后进行开发。脚本还是很简单的。例如:
=======脚本开始========
#!/bin/bash
#set -x
USERNAME=$1
WORKSPACE_DIR=$2
PRODUCTS=$3
echo "Creating workspace directory"
echo "================"
mkdir -p $WORKSPACE_DIR
cd $WORKSPACE_DIR
echo "Fetching iPhone project sources"
echo "================"
svn co --username $USERNAME SVNURL iPhoneProject
svn co -r 2642 SVNURL iPadProject
echo "Fetching shared libraries sources"
echo "================"
mkdir -p sharedLibs
cd sharedLibs
svn co --username $USERNAME SVNURL DataAccess
svn co --username $USERNAME SVNURL Model
=======脚本结束========
* iphone和ipad开发使用不同的工程文件,即不同的.xcodeproj文件。将通用的文件放到单独的文件夹中,并且使用静态库的方式引用。类似于Three20和Core
*iphone 和 android使用同样的底层库,包括网络交互和xml解析等等。是使用c++实现的。不过,这样导致代码比较大,约4MB。
==========FIL代码经验 End============
+++++