Category Archives: Hello World

Hello World

ios开发入门—–解析json

作为一种轻量级的数据交换格式,json正在逐步取代xml,成为网络数据的通用格式

从ios5开始,apple提供了对json的原生支持,但为了兼容以前的ios版本,我们仍然需要使用第三方库来解析

常用的ios json库有json-frameworkJSONKitTouchJSON等,这里说的是JSONKit

JSONKit的使用相当简单,从github.com下载下来,添加到ios项目中,让好在要使用json的地方“#import “JSONKit.h””,json相关的方法,就会自动添加到NSString、NSData下,

常用的方法,有下面几个:

    - (id)objectFromJSONString;
    - (id)objectFromJSONStringWithParseOptions:(JKParseOptionFlags)parseOptionFlags;
    - (id)objectFromJSONData;
    - (id)objectFromJSONDataWithParseOptions:(JKParseOptionFlags)parseOptionFlags;

如果json是“单层”的,即value都是字符串、数字,可以使用objectFromJSONString:

    NSString *json = @"{\"a\":123, \"b\":\"abc\"}";
    NSDictionary *data = [json objectFromJSONString];
    NSLog(@"json.a:%@", [data objectForKey:@"a"]);
    NSLog(@"json.b:%@", [data objectForKey:@"b"]);
    [json release];

如果json有嵌套,即value里有array、object,如果再使用objectFromJSONString,程序可能会报错(我的测试结果:使用由网络得到的php/json_encode生成的json时报错,但使用NSString定义的json字符串时,解析成功),最好使用objectFromJSONStringWithParseOptions:

    NSString *json = @"{\"a\":123, \"b\":\"abc\", \"c\":[134, \"hello\"], 
        \"d\":{\"name\":\"张三\",\"age\":23}}";
    NSLog(@"json:%@", json);
    NSDictionary *data = [json objectFromJSONStringWithParseOptions:JKParseOptionLooseUnicode];
    NSLog(@"json.c:%@", [data objectForKey:@"c"]);
    NSLog(@"json.d:%@", [[data objectForKey:@"d"]objectForKey:@"name"]);
    [json release];

结果:
2012-07-09 18:48:07.255 Ate-Goods[17113:207] json.c:(
134,
hello
)
2012-07-09 18:48:07.256 Ate-Goods[17113:207] json.d:张三

从上面的写法可以看出,json与objece-c的数据对应关系如下:
Number -> NSNumber
String -> NSString
Array -> NSArray
Object -> NSDictionary
另外:
null -> NNSNull
true and false -> NNSNumber
(呵呵,看起来很不错)

关于JKParseOptionFlags参数的可选项,请参照github的文档,这里不在列举

————-

Hello World 他山石

[转]Objective-C 字符串与数值互相转换

Convert NSString to int

NSString *aNumberString = @"123";
int i = [aNumberString intValue];

Convert int to NSString

int aNumber = 123;
NSString *aString = [NSString stringWithFormat:@"%d", aNumber];

———-
转自:http://blog.163.com/prevBlogPerma.do?host=zyc-to&srl=171524002010104680552&mode=prev

Hello World

ios开发入门—-view的简单使用

向视图中添加一个控件:

 UIScrollView *weatherBack = [[UIScrollView alloc]
	initWithFrame:CGRectMake(100, 100, 100, 139)];
 //背景色   
[weatherBack setBackgroundColor:[UIColor colorWithRed:
	255 green:0 blue:0 alpha:0.5]];
//滚动范围
[weatherBack setContentSize:CGSizeMake(421, 139)];
 //放入view  
 [[self view]addSubview:weatherBack]; 
//addsubview会自动retrain,所以这里要四方
[weatherBack release];

向控件中添加控件:

 UILabel* weekL = [[UILabel alloc] initWithFrame:
	CGRectMake(5, 3, 50, 30)];            
[weekL setText:@”星期三”];            
[weekL setFont:[UIFont fontWithName:
	@"Helvetica-Bold" size:16]];            
[weekL setBackgroundColor:[UIColor colorWithRed:
	0 green:0 blue:0 alpha:0]];            
[weekL setTextColor:[UIColor colorWithRed:
	255 green:0 blue:0 alpha:0.9]];
//将label添加到父节点中            
[text addSubview:weekL];
[weekL release];

响应事件:

//新建一个按钮
UIButton* testB = [[UIButton alloc] initWithFrame:
	CGRectMake(75, 85, 80, 20)];            
[testB setTitle:@"test" forState:UIControlStateNormal];
//将[self testButton]方法 绑定到UIControlEventTouchUpInside
[testB addTarget:self action:@selector(testButton:)
	forControlEvents:UIControlEventTouchUpInside];            
[text addSubview:testB];            
[testB release];

testButton的定义:

//事件处理方法
-(IBAction)testButton:(id)sender{    
	UIAlertView *alert = [[UIAlertView alloc]initWithTitle:
		@"hello" message:nil delegate:self
 		cancelButtonTitle:@"取消" 			
		otherButtonTitles:@"确定",
		nil];   
	[alert show];    
	[alert release];
}

以上操作,都可以在xcode自带的“所见即所得”工具“IB”中完成,在书本和网上找到的入门教程也都是使用IB,但大部分时候,我们仍然需要使用代码来做这些工作
————

Hello World

NSNotificationCenter 的使用

1. 定义一个方法

      -(void) update{       
             //...
      }

2. 对象注册,并关连消息

     [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(update) name:@"gotoupdate" object:nil]

3. 在要发出通知消息的地方

     [[NSNotificationCenter defaultCenter] postNotificationName:@"gotoupdate" object:nil];

每个运行中的application都有一个NSNotificationCenter的成员变量,它的功能就类似公共栏. 对象注册关注某个确定的notification(如果有人捡到一只小狗,就去告诉我). 我们把这些注册对象叫做 observer. 其它的一些对象会给center发送notifications(我捡到了一只小狗). center将该notifications转发给所有注册对该notification感兴趣的对象. 我们把这些发送notification的对象叫做 poster
Notification 就是设计模 式中的 观察者模式, cocoa为我们实现了该模式


———————————
2012.7.11

刚发现一个严重的问题,如果使用addObserver多次注册同一个方法,再通过postNotificationName调去方法,这个方法会被执行多次!
解决的方法,是在方法调用以后,通过removeObserver方法解除注册

     -(void) update{
          [[NSNotificationCenter defaultCenter]removeObserver:self name:@"gotoupdate" object:nil];
          //...
     }
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慢慢长大,问题便逐步暴漏了~~~常在河边走,哪能不湿鞋~~~~以后还是小心点吧

Hello World

Xcode部署phoneGap

前在android-eclipse内搞phoneGap项目,照着phoneGap官网的“开发入门”,很容易就部署成功了helloword项目~~~java的最大优势:什么东西都可以一个jar包搞定

但今天搞phoneGap ios项目却颇废了一番周折,究其原因,一来是第一次搞xcode,不熟悉;二来是phoneGap官网的ios“开发入门”写的真不什么样,云里雾里

下面把关键的几步说一下:

1. 下载最新的phoneGap,安装里面的ios/PhoneGap-x.dmg

2. 打开xcode,“new project”,选择“phoneGap-based Application”,新建你的项目

3. 点击左上角的“Run”,这时,会打开iphone模拟器,打开你的项目,显示找不到index.html的错误~~经过这一步,你的项目目录下会生成www目录,但还不会出现在xcode中

4. 在xcode的左侧项目导航中,选择你的项目,按住ctrl,右击,选择“Add Files To “helloword””,在弹出菜单中,将你项目下的www目录添加到项目中,下方的“folders”选择“Create Folder References For Any Added Folders”,“Add”,此时,左侧项目导航中会出现xcode

5. 这是再点击左上角的Run,在模拟器中可以看到刚才添加的index.html中的内容

6. 貌似,在xcode的左侧项目导航中,是无法在www目录下建立文件夹和js、html等文件的,别急,可以直接Finder窗口中打开www目录,然后新建这些东西,xcode会立即显示出来,你就可以在其中编辑它啦

————

参考:http://mobile.51cto.com/web-334924.htm