object-c的内存管理还真是个头痛的问题,看了蛮多的文章讨论,还是免不了犯错,最近小小的实验了一下,做个小记.
view的retiancount变化:alloc为1,被addSubview加1,removeFromSuperView减1,而controller有点不同在于它的view被addSubview,它本身并不会加一,比如:
lab=[[UILabel alloc] init];
[lab setFrame:CGRectMake(120, 100, 80, 20)];
NSLog(@"after alloc---%d",[lab retainCount]);
[self.view addSubview:lab];
NSLog(@"after addSubview---%d",[lab retainCount]);
[lab removeFromSuperview];
NSLog(@"after remove---%d",[lab retainCount]);
[lab release];
NSLog(@"after release---%d",[lab retainCount]);
控制台的输出:
2010-11-06 16:07:23.145 viewTest1[1430:207] after alloc,test count is 1
2010-11-06 16:07:23.147 viewTest1[1430:207] after alloc---1
2010-11-06 16:07:23.147 viewTest1[1430:207] after addSubview---2
2010-11-06 16:07:23.148 viewTest1[1430:207] after remove---1
2010-11-06 16:07:23.148 viewTest1[1430:207] after release---1
2010-11-06 16:07:23.149 viewTest1[1430:207] after addSubview,test count is 1
标记test的是controller,lab在这里是实例变量,用于测试dealloc,里面用了remove和release,使得lab在这里retainCount变为0,在alloc所在的函数里不显示为0,还是显示为1(奇怪...)
再加几个NSLog,得到
2010-11-06 16:40:23.482 viewTest1[1654:207] fisrt---0
2010-11-06 16:40:23.483 viewTest1[1654:207] after alloc---1
2010-11-06 16:40:23.484 viewTest1[1654:207] after addSubview---2
2010-11-06 16:40:23.484 viewTest1[1654:207] after remove---1
2010-11-06 16:40:23.485 viewTest1[1654:207] after release---1
刚开始显示0,因为lab是nil,[nilretainCount]输出为0.
在类的dealloc里面lab的retainCount已经为0,调用它的任何函数都会BAD_ACCESS,包括[lab retainCount]和[lab release],所以dealloc里实例变量release之后最好nil一下,因为对nil的任何操作都不会BAD_ACCESS,在dealloc里也就可以release了.
关键还是alloc和release的配对,对于不配对的情况赋值nil可以避免错误
似乎是挺简单的东西,但还是得注意,细节决定成败
PS:在mac下排版还真不方便将就将就吧..
在android开发中,listview的默认背景颜色是黑色的,所以在UI设计中,肯定会对它进行美化处理,尤其是在游戏开发中。最近在做用户聊天框的时候遇到一个这样的问题,我把显示用户聊天记录的listview背景设置成白色的,看起来没有什么问题,但是当我滚动滚动条的时候,有内容的listitem全部变成黑色的了,效果很不好。
google了一下,原因是:默认的ListView的背景是透明的,而ListView的背景是固定不变的,所以当我滚动滚动条的时候,会实时地去将当前每个Item的显示内容跟背景进行混合运算,所以android系统为了优化这个过程用,就使用了一个叫做android:cacheColorHint的属性,在黑色主题下默认的颜色值是#191919,所以就出现了刚才那样的效果。
解决的办法:如果你只要换背景颜色,就只需将android:cacheColorHint属性设置成你想要的颜色就行了。如果需更换背景图片,则需使用android:background="@drawable/bg"属性,并把android:cacheColorHint设置成(#00000000)透明的就ok了。
看看这篇文章http://zhoujianghai.iteye.com/blog/813868
你可以把listview的背景设置成白色或者白色的底图,然后listview里显示的textview字体设置成黑色
在写J2ME 程序时,模拟器每次都在程序联网时弹出提示,要你确认。这是很烦的。去掉这个提示也很容易。
在NetBeans 6.9 中,
1、 在项目窗口中右键你的项目
2、 选择属性,再点“运行”,将安全域设为 Maximum。就可以了。如图
还有一个方法,双击打开你安装在电脑上的WTK
点击偏好,点到“安全“,同样,设为Maximum就可以了。如图:
来源:http://blog.csdn.net/nairuohe/archive/2010/11/02/5982376.aspx