佳为好友

原:iPhone编程小经验 -7

日期: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============


+++++

posted on 2012-12-29 19:52 佳为好友 阅读(242) 评论(0)  编辑 收藏 引用 所属分类: 非UI


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


导航

<2012年12月>
2526272829301
2345678
9101112131415
16171819202122
23242526272829
303112345

留言簿(1)

随笔分类

搜索

最新评论

评论排行榜