Tag Archives: ios

Hello World 他山石

ios入门—-定位的使用[转]

IOS中的core location提供了定位功能,能定位装置的当前坐标,同时能得到装置移动信息。因为对定位装置的轮询是很耗电的,所以最好只在非常必要的前提下启动。
其中,最重要的类是CLLocationManager,定位管理。
其定位有3种方式:
1,GPS,最精确的定位方式,貌似iphone1是不支持的。
2,蜂窝基站三角定位,这种定位在信号基站比较秘籍的城市比较准确。
3,Wifi,这种方式貌似是通过网络运营商的数据库得到的数据,在3种定位种最不精确

使用方式:
1,引入CoreLocation的包,一般的默认模板里是没有的,所以需要手动导入。
2,通过启动CLLocationManager来启动定位服务,因为定位信息是需要轮询的,而且对于程序来说是需要一定时间才会得到的,所以翠玉lcationManager的操作大多都给委托来完成。
加载locationManager的代码:

CLLocationManager *locationManager = [[CLLocationManager alloc] init];//创建位置管理器  
locationManager.delegate=self;  
locationManager.desiredAccuracy=kCLLocationAccuracyBest;  
locationManager.distanceFilter=1000.0f;  
//启动位置更新  
[locationManager startUpdatingLocation];

desiredAccuracy为设置定位的精度,可以设为最优,装置会自动用最精确的方式去定位。
distanceFilter是距离过滤器,为了减少对定位装置的轮询次数,位置的改变不会每次都去通知委托,而是在移动了足够的距离时才通知委托程序,它的单位是米,这里设置为至少移动1000再通知委托处理更新。
startUpdatingLocation就是启动定位管理了,一般来说,在不需要更新定位时最好关闭它,用stopUpdatingLocation,可以节省电量。

对于委托CLLocationManagerDelegate,最常用的方法是:

- (void)locationManager:(CLLocationManager *)manager   
    didUpdateToLocation:(CLLocation *)newLocation   
           fromLocation:(CLLocation *)oldLocation;

这个方法即定位改变时委托会执行的方法。
可以得到新位置,旧位置,CLLocation里面有经度纬度的坐标值,
同时CLLocation还有个属性horizontalAccuracy,用来得到水平上的精确度,它的大小就是定位精度的半径,单位为米。
如果值为-1,则说明此定位不可信。

另外委托还有一个常用方法是

- (void)locationManager:(CLLocationManager *)manager   
       didFailWithError:(NSError *)error ;

当定位出现错误时就会调用这个方法。
———–
转自:http://blog.csdn.net/csj1987/article/details/6657468

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

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时有回到第一步,如此循环。