Monthly Archives: 六月 2012

Hello World

initWithNibName与viewDidLoad

第一次做实际的ios项目,从svn下来项目便马不停蹄的敲代码,照这近一段时间新学的objc的东西,以及四处google/百度,以及之前做的示例项目,终于把整个的流程写通了~~~模拟器运行,解决了几个小bug之后,数据总是显示不到界面的UITextView里~~~但是,不报错,而且能写到日志里~~晕~~~向界面写数据的代码是之前示例项目测试ok的~~~~难道是A?难道是B………一阵瞎猜,折腾了一个小时也还不行
下班路上,突然灵光一现,想起了之前看的某条资料里讲过objc里对象初始化时,init方法和viewDidLoad方法的执行时机问题~~~~刚才试着将写Text的方法从init里提到了viewDidLoad里。。。通过!!!

———-备忘———
UIView的一些基本方法 init、loadView、viewDidLoad、viewDidUnload、dealloc:

init方法
在init方法中实例化必要的对象(遵从LazyLoad思想)
‍init方法中初始化ViewController本身

loadView方法
当view需要被展示而它却是nil时,viewController会调用该方法。不要直接调用该方法。
如果手工维护views,必须重载重写该方法
如果使用IB维护views,必须不能重载重写该方法
loadView和IB构建view

viewDidLoad方法
重载重写该方法以进一步定制view
在iPhone OS 3.0及之后的版本中,还应该重载重写viewDidUnload来释放对view的任何索引
viewDidLoad后调用数据Model

viewDidUnload方法‍
当系统内存吃紧的时候会调用该方法(注:viewController没有被dealloc)
内存吃紧时,在iPhone OS 3.0之前didReceiveMemoryWarning是释放无用内存的唯一方式,但是OS 3.0及以后viewDidUnload方法是更好的方式
在该方法中将所有IBOutlet(无论是property还是实例变量)置为nil(系统release view时已经将其release掉了)
在该方法中释放其他与view有关的对象、其他在运行时创建(但非系统必须)的对象、在viewDidLoad中被创建的对象、缓存数据等 release对象后,将对象置为nil(IBOutlet只需要将其置为nil,系统release view时已经将其release掉了)
一般认为viewDidUnload是viewDidLoad的镜像,因为当view被重新请求时,viewDidLoad还会重新被执行
viewDidUnload中被release的对象必须是很容易被重新创建的对象(比如在viewDidLoad或其他方法中创建的对象),不要release用户数据或其他很难被重新创建的对象

viewDidLoad总是在loadView之后调用,不管你是不是通过nib文件创建的,这个方法总是会被调用的。
viewDidUnload在收到内存警告的时候调用,在我的理解,这个方法里面应该做几件事情:
1、释放掉一些比较容易创建的对象,或者是一些比较占资源的对象(图片、音频等)
2、如果界面控件自己保持了引用计数,这里也要释放掉。(比如说,这个控件被设成了属性,而且是retain的,这个retain的引用计数就必须释放掉)
3、如果跨类的参数传递机制会在viewDidUnload以后产生不正常的效果,这里也必须处理。

dealloc方法

viewDidUnload和dealloc方法没有关联,dealloc还是继续做它该做的事情

流程:

(loadView/nib文件)来加载view到内存 ——>viewDidLoad函数进一步初始化这些view ——>内存不足时,调用viewDidUnload函数释放views —->当需要使用view时有回到第一步,如此循环。

Hello World 他山石

[转]在ios模拟器上实现模拟双指触摸

在iPhone模拟器上测试iOS应用程序,亦或任何手机的PC端模拟器,最难模拟的恐怕就是多指触摸,因为咱PC上没有这个硬件输入设备呀。

虽然MacBook系列的触摸版支持多指触摸,但是也不能实现先定位,再触摸。


后来我无意中发现,在iPhone模拟器上,按住Option键,效果看图中,这时你就能模拟双指触摸了。当然,只能模拟二指水平拖动、旋转效果。要想模拟捏合手势?按住Option-Shift键就行了。
———
转自:http://www.liheran.com/?p=193

Hello World

missing sentinel in method dispatch

objective-c怪异的语法,下面数组的写法,第一个会报错,第二个就ok

NSArray *signs1;
    signs1 = [NSArray arrayWithObjects:@"+",@"÷",@"×",@"-"];
 
NSArray *signs2;
    signs2 = [NSArray arrayWithObjects:@"+",@"÷",@"×",@"-",nil];

查了一下教程,使用arrayWithObjects方法为数组添加数据,nil代表结束,另外,这也是数组中不能传出nil的原因 :???: :???:

Hello World 他山石

[转]Objective-C字符串处理

	NSLog(@"字符串处理");
	//获得字符串长度
	NSString* str1=@"MAC OS Pro";
	NSLog(@"长度是 %d",[str1 length]);
	//两个字符串连接
	NSString* str2=@"MAC OS Pro";
	NSString* str3=@" Leopard";
	NSString* str4=[str2 stringByAppendingString:str3];
	NSLog(str4,nil);
	NSString* str5=[str2 stringByAppendingFormat:@" %d",10];
	NSLog(str5,nil); 
	//可修改字符串
	NSMutableString* string=[NSMutableString string];
	[string appendString:@"Mac"];
	[string appendString:@" OS"];
	[string appendString:@" X"];
	NSLog(string,nil); 
	//插入字符串
	NSMutableString* string1=[NSMutableString stringWithFormat:@"Mac X"];
	[string1 insertString:@"OS " atIndex:4];
	NSLog(string1,nil);
	//删除字符串
	NSMutableString* string2=[NSMutableString stringWithFormat:@"删除字符串"];
	[string2 deleteCharactersInRange:NSMakeRange(0, 2)];
	NSLog(string2,nil);
	//字符串比较
	BOOL result;
	result=[string isEqualToString:string1];
	NSLog(@"%d",result,nil);
	//比较前置串与后置串
	NSString* string3=@"Mac Pro";
	NSString* string4=@"Mac OS";
	//判断是否以Mac开头
	result=[string3 hasPrefix:@"Mac"];
	NSLog(@"%d",result,nil);
	//判断是否以OS结尾
	result=[string4 hasSuffix:@"OS"];
	NSLog(@"%d",result,nil);
	NSString* string5=@"This is Mac OS X";
	//检索字符串
	NSRange range;
	range=[string5 rangeOfString:@"Mac OS"];
	if (range.location!=NSNotFound) 
	{
		//得到字符串的位置和长度
		NSLog(@"%d,%d",range.location,range.length);
	}
	else 
	{
		NSLog(@"没有发现",nil);
	}
	//抽取部分字符串
	NSString* string6=@"This is Mac OS X";
	NSString *nstr1,*nstr2,*nstr3;
	//从开头抽取字符串
	nstr1=[string6 substringToIndex:4];
	NSLog(nstr1,nil);
	//抽取末位位置的字符串
	nstr2=[string6 substringFromIndex:8];
	NSLog(nstr2,nil);
	//抽取指定范围的字符串
	nstr3=[string6 substringWithRange:NSMakeRange(5,2)];
	NSLog(nstr3,nil);

//结果
2011-10-20 14:05:43.940 StringProcessing[1870:1307] 字符串处理
2011-10-20 14:05:43.942 StringProcessing[1870:1307] 长度是 10
2011-10-20 14:05:43.943 StringProcessing[1870:1307] MAC OS Pro Leopard
2011-10-20 14:05:43.943 StringProcessing[1870:1307] MAC OS Pro 10
2011-10-20 14:05:43.944 StringProcessing[1870:1307] Mac OS X
2011-10-20 14:05:43.945 StringProcessing[1870:1307] Mac OS X
2011-10-20 14:05:43.945 StringProcessing[1870:1307] 字符串
2011-10-20 14:05:43.946 StringProcessing[1870:1307] 1
2011-10-20 14:05:43.946 StringProcessing[1870:1307] 1
2011-10-20 14:05:43.947 StringProcessing[1870:1307] 1
2011-10-20 14:05:43.947 StringProcessing[1870:1307] 8,6
2011-10-20 14:05:43.948 StringProcessing[1870:1307] This
2011-10-20 14:05:43.948 StringProcessing[1870:1307] Mac OS X
2011-10-20 14:05:43.949 StringProcessing[1870:1307] is
————
转自:http://www.cnblogs.com/CCSSPP/archive/2011/10/20/2218897.html

Hello World

thrift数值越界及其处理

php调用thrift,今天碰上了一个看似诡异的问题:php调thrift的一个方法,传递一个参数“6010101033”,可到了java端取到的时“6442450943”,开始以为是哪个地方写错了,全局搜索“64…”也没搜到什么结果~~~后来java端的同事说“可能是越界了”~~~嗯,还真有可能:thrift定义使用的是i64,php内部接收get参数,会做字符串处理,但当调用thfift接口时,貌似默认会将数值按照integer类型传递,相当于thirft的i32,对于超出范围的数值,自然就要出问题了

发现了问题,解决起来自然就是很容易的事,”$id = (double)$id;”,强制转成double,测试ok了

ps:这里转成string是没有用的,因为本来就是string类型,string转数值时才出的问题

从一开始使用thrift就被告诫说数值类型需要做强制类型转换,但由于php基本不怎么区分类型,所以一直也没做过这种转换,也没有发现过问题,但是随着业务的扩大,id慢慢长大,问题便逐步暴漏了~~~常在河边走,哪能不湿鞋~~~~以后还是小心点吧