这些天,折腾ios的那些事

这些天,折腾ios的那些事,第1张

概述序言 从清明假回来,部门老板开始给我布置实习的第二个任务,叫我按照一个很蛋疼的登陆流程做一个iPad应用的登陆模块,也许说起登陆模块大家都会,就是验证用户名和密码的过程,但是实际的产品的登陆流程却远比这个复杂,这里不对登陆过程具体介绍了,主要说说折腾ios具体开发过程的事情,作为一个初入行的码农,以后一定要记住这些教训。 (1)工作任务很简单,先看懂PC版的登陆流程,然后照葫芦画瓢的将其流程在ip

序言

从清明假回来,部门老板开始给我布置实习的第二个任务,叫我按照一个很蛋疼的登陆流程做一个iPad应用的登陆模块,也许说起登陆模块大家都会,就是验证用户名和密码的过程,但是实际的产品的登陆流程却远比这个复杂,这里不对登陆过程具体介绍了,主要说说折腾ios具体开发过程的事情,作为一个初入行的码农,以后一定要记住这些教训。

(1)工作任务很简单,先看懂PC版的登陆流程,然后照葫芦画瓢的将其流程在ipad上运行起来。pc版的是一个同事写的,用的C#,vc08版和10版的版本转化就折腾了半天,不过前两周一直再整C#,所以代码看起来还比较快,花了一天的事情对蛋疼的流程终于有了一个清晰的了解,不过后来发现还是有个地方没有理解老板的意图,还好补救起来不是很麻烦。题注:以后接任务的时候一定要弄清楚老板的最终目的,一定要拿个小本记清楚,长期堆代码的人脑子不够用,和同事的交流一定要不嫌麻烦,交流的过程实际上就是交流感情的过程,以后的圈子就是这样建立的。

(2)ipad的开发当然要用到mac,xcode,还好机子环境都已经搭建好了,ipad版本的已有代码拷贝下来,开始整啦。第一个问题,就是ios开发的模拟器调试和真机联机调试(device)的区别,听同事说的,模拟器的运行处理过程其实是用的机器的intel处理器,而ipad上是用的arm处理器,部分代码在两个调试平台会有些区别,具体什么区别现在我还没有接触到。而真机调试需要去苹果官方申请开发者权限,下载ios开发的私钥和许可证才行。私钥其实就相当于现在各大开放平台的appID和secretKey,而许可证就相当于官方注册你要调试机器的固件编号,对其分发一个和私钥配对的解密字符串。 搞了半天下载的私钥都出不来,最后还是直接从同事的另一台mac上把私钥拷贝出来,环境这才算搭好。题注:虽然很多问题要自己想办法解决,但是同事以前做过的话,过去喊一声,总比你在那里研究半天的强;在给你解决问题的过程中还能对你言传身教的,可以让你学到不少东西,至少可以少走弯路,更快的完成老板交代的任务。

(3)总算可以闲下来写代码了,ipad和iphone的开发没有什么区别,虽然以前自己也折腾过几个小实例,看过那个所有初学者都会看的objective-c基础教程,但真正自己写代码还真没有怎么接触过。所以就当边学边练了。

技术问题

讨论一些工作工程中花比较多时间解决的问题:

(1)iOS内存分配和释放的问题

开始在window的appDaleget中写了一些UIAlertvIEw,调试代码的时候执行到AlertvIEw show的时候在主线程里就提示SIGbarT错误,一开始以为是Daleget中不能显示AlertVIEw,以前看书是说最好不要在Dale get中去显示界面的东西,就有这样的误会。 不过在同事确认可以后,将问题确认为代码漏洞。于是将AlertvIEw 置于函数入口,直接return,发现在Daleget是可以显示的,于是将alertvIEw 一步步的后移,终于确定了出问题的函数,进入函数之后,在一部分一部分的代码注释,最后终于确定了问题代码行:

 NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];[defaults release];

问题就出在release 上,defaults的初始化并没有调用init分配内存。刚写代码,所以一直谨记ios开发的init release原则,所以每遇到一个*对象的时候就去release它,结果这样是不对的。后面又遇到这样的内存释放问题,由于谨记上一次教训,开始以为alloc就要release,其实也不是这样的,只有init 你才需release;以后遇到这样的问题,宁愿少release,也不要多release。因为有些对象你不release是不会出问题的。


(2)iOS联机调试的文件拷贝问题

iOS联机调试时需要将程序中的资源文件先拷贝到调试机器里,我一开始不知道,将文件放到xcode的机器上,检查文件是否存在时发现路径是机器的路径。这下就滑稽了,不知道怎么拷贝一个文件到ipad的应用目录下去,mac下也查不到ipad的磁盘,最后询问同事才知道拷贝资源文件到程序是在程序里做的,给我的版本是只要目录存在就不拷贝,我的个去呀,原来时这样的。所以只能在机器上先把原有的应用删掉,然后command+R,拷贝文件,OK!


(3) iOS判断是否有网络的程序

在判断网络是否存在的情况下,我开始的做法时send一个登录百度的http请求,如果请求的返回码是200-300之间,我就判定有网,而pc版的做法也是开一个Ping百度的线程,看是否能够Ping成功,可是ipad上没法用Ping呀。所以只有另寻办法,在网上找了找,发现下面这段代码能用,嘿,贴下来,供以后使用。

//check if net OK-(BOol) checkNet {    bool ans = NO;        // Create zero addy    struct sockaddr_in zeroAddress;    bzero(&zeroAddress,sizeof(zeroAddress));    zeroAddress.sin_len = sizeof(zeroAddress);    zeroAddress.sin_family = AF_INET;        // Recover reachability flags    SCNetworkReachabilityRef defaultRouteReachability = SCNetworkReachabilityCreateWithAddress(NulL,(struct sockaddr *)&zeroAddress);    SCNetworkReachabilityFlags flags;        BOol dIDRetrIEveFlags = SCNetworkReachabilityGetFlags(defaultRouteReachability,&flags);    CFRelease(defaultRouteReachability);        if (!dIDRetrIEveFlags)    {        NSLog(@"Error. Could not recover network reachability flags");        ans = NO;    }        BOol isReachable = flags & kSCNetworkFlagsReachable;    BOol needsConnection = flags & kSCNetworkFlagsConnectionrequired;    ans = (isReachable && !needsConnection) ? YES : NO;        return ans;}

(4) iOS xml解析问题

这个问题困扰了我很久,ios有一个解析XML的标准库,叫NSXMLParser,网上还说,解析XML的方法很多,各种各样的办法很多,我不想包含第三方的库,所以我还是选择自带的NSXMLParser。这个库是用了xml 代理的方式,具体解释一下这个代理,这个代理就是自己新建一个xml解析的类,在这个类里创建一个NSXMLParser的对象,然后将代理设为这个新建的xml类。另外新建的xml解析类必须继承NSXMLParserDelegate协议,然后在新建的xml类中自己实现这些协议的方法。具体看代码吧。

首先自己定义存放解析数据的数据结构:

//存储用户名和密码的数据结构@interface  UserPwd: NSObject {    Nsstring *_username;    Nsstring *_passwd;}@property (nonatomic,retain) Nsstring *username;@property (nonatomic,retain) Nsstring *passwd;@end@implementation UserPwd@synthesize username = _username;@synthesize passwd = _passwd;-(voID) dealloc{    [_username release];    [_passwd release];}@end

然后实现自己创建的xml解析类:

@implementation XMLParser- (voID) parseXMLfile:(Nsstring *)xmlfilename{    NSData *data = [[NSData alloc] initWithContentsOffile:xmlfilename];    NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data]; //    NSXMLParser *parser = [[NSXMLParser alloc] initWithContentsOfURL:[[NSURL alloc] initWithString:xmlfilename]];    [parser setShouldProcessnamespaces:NO];        [parser setShouldReportnamespacePrefixes:NO];    [parser setShouldResolveExternalEntitIEs:NO];    [parser setDelegate:self];    [parser parse];} -(voID)parser:(NSXMLParser *)parser dIDStartElement:(Nsstring *) elementname namespaceURI:(Nsstring *) namespaceURI qualifIEdname:(Nsstring *) qualifIEdname attributes:(NSDictionary *)attributeDict{     NSLog(@"111begin");     if([elementname isEqualToString:@"user"]) {         NSLog(@"User");         s_UserPwd = [[UserPwd alloc] init];        //读每个elemet的属性值 
	[s_UserPwd setUsername:[attributeDict objectForKey:@"username"]];         [s_UserPwd setPasswd:[attributeDict objectForKey:@"password"]];                  NSLog(@"%@",[s_UserPwd username]);     }     }}
//解析每个element的value- (voID)parser:(NSXMLParser *)parser foundCharacters:(Nsstring *)string {    NSLog(@"%@",string);}//element结束时的动作- (voID)parser:(NSXMLParser *)parser dIDEndElement:(Nsstring *)elementname  namespaceURI:(Nsstring *)namespaceURI qualifIEdname:(Nsstring *)qname {    NSLog(@"111end");}//报告解析的结束-(voID)parserDIDEnddocument:(NSXMLParser*)parser{    }//报告不可恢复的解析错误-(voID)paser:parserErrorOccured{    }@end

(5)iOS UIWebvIEw获取屏幕touch按钮事件问题的解决

这个问题给困扰了我一天,最后投机用了一个方法才搞定,问题是这样的,在一个UIWebvIEw中加载了一个登录页,页面中有一个登录按钮(HTML元素),问题就是我如何在vIEwcontroller中获取这个页面元素的的点击事件,网上说ios里的webvIEw中无法获取touch事件,这可怎么半?

查资料发现,IOS可以和JavaScript交互,你在ios中可以获取页面中的标题、元素、提交表单,插入Js,但是Js中元素的onclick事件中却无法插入ios的代码。而ios的UIWebvIEw中只能截获url跳转事件,开始的登录按钮没有onclick事件,是为了安全性的考虑,参考同事安桌板的做法,给登录按钮设置了一个onclick事件,让其调转到一个有指定标记(登录标记)的url,然后再在UIwebvIEw中截获
这个事件,就OK了。

- (BOol)webVIEw:(UIWebVIEw *)webVIEw shouldStartLoaDWithRequest:(NSURLRequest *)request navigationType:(UIWebVIEwNavigationType)navigationType{    //获取当前调转页面的URL    Nsstring *_loginURL = [[request URL] absoluteString];    //如果当前URL有当前登录标记,则进行登录验证    if([[_loginURL lowercaseString] rangeOfString:@"login标记"].length > 0)    {        username = [webVIEw stringByEvaluatingJavaScriptFromString:@"document.getElementsByname('loginID')[0].value"];        passWd = [webVIEw stringByEvaluatingJavaScriptFromString:@"document.getElementsByname('passwd')[0].value"];        [self iPADLogin];    }     return YES;}
总结

以上是内存溢出为你收集整理的这些天,折腾ios的那些事全部内容,希望文章能够帮你解决这些天,折腾ios的那些事所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1091808.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-27
下一篇 2022-05-27

发表评论

登录后才能评论

评论列表(0条)

保存