- 浏览: 933315 次
- 性别:
- 来自: 山西
文章分类
最新评论
-
白小默:
你好 可以提供下源码DEMO吗,不知为何,我导出来的excel ...
jxls 使用模板文件导出生成excel -
zkzqzzz:
博主威武!
让微信二维码扫描您的APK -
zkzqzzz:
感谢博主 原来那些类都不是必须的 或者自己写!!博主真棒 ...
抢红包插件实现原理浅析 -
zkzqzzz:
博主 请问你的其他类在哪里呢?
抢红包插件实现原理浅析 -
zkzqzzz:
其他类在哪呢?
抢红包插件实现原理浅析
http://mobile.51cto.com/hot-249895.htm
做iPhone开发首先第一件就是得知道iPhone程序的生命周期,说白点就是当点击程序图标启动程序开始到退出程序整个使用运行过程中底下的代码都发生了什么,只有理解了这个才能游刃有余的掌握iPhone程序的开发,否则在写程序的时候有点浑浑僵僵不知所以然的感觉。首先忘记Xcode给我们生成的代码模板,忘记xib忘记ib,我们亲自一行一行来写一个Hello World程序,虽然真正开发项目的时候并不需要这样做Xcode模板和ib都会为我们做好这些打杂的事情,但是现在完全由我们自己来写,放心这个程序是个非常的简单的Hello World 程序,代码也很少总共加起来不过10几行。
在这之前我们先来看看Objective-C语言的关于这段协议代码:
- @protocol SimpleProtocol
- -(void)doSomething:(NSString *)str;
- @end
- @interface SimpleClass:NSObject< SimpleProtocol >{
- }
- @end
- @implementation SimpleClass
- -(void) doSomething:(NSString *)str{
- NSLog(str);
- }
- @end
这样是一个简单的协议示例,类SimpleClasss实现了名为SimpleProtocol的协议。协议在其它语言里跟接口非常类似,记住这个协议的实现,接下来会有用的。
接下来用Xcode新建一个名为HelloWorld的Window-based Application类型的项目。大体上讲一下项目的文件结构,由Xcode模板生成的项目主要包含Classes(Hello World Appdelegate.h和Hello World Appdelegate.m)、Other Sources(main.m和Hello World_Prefix.pch)、Resources(Main Window.xib和Hello World-info.plist)、Frameworks(iPhone SDK提供的系统框架)、Products(Hello World.app)这几部分。直接运行这个工程会在模拟器里看到一个白色的显示界面程序,由此可见没写一行代码Xcode已经给我们生成了一个很简单的项目模板。
每一个iPhone程序都包含一个UIApplication对象,它管理整个程序的生命周期,从加载第一个显示界面开始,并且监听系统事件、程序事件调度整个程序的执行。那么上面这个简单项目中的UI Application对象在哪呢?在这个项目中我们找不到任何关于UI Application的代码,其实在项目中UI Application对象是由UI Application Main方法初始化到内存中,首先打开Other Sources文件夹下的main.m源文件,里面只包括了一个main方法,和所有的C程序一样这个是程序入口。代码如下:
- int main(int argc, char *argv[]) {
- NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
- int retVal = UIApplicationMain(argc, argv, nil, nil);
- [pool release];
- return retVal;
- }
在main函数中第二行代码UI Application Main(argc, argv, nil, nil);对UIApplication对象进行了初始化,这个方法除了argc 和 argv 参数外,另外这个函数还有2个两个字符串参数来识别UI Application类和UI Application代理类,在这里默认是2个nil,第一个参数为nil就默认把UI Application类作为缺省值进行初始化,可以在这里不填nil而是使用自己定义的UI Application子类。至于第二个参数nil就设置为nil就把模板生成的Hello World Appdelegate类作为默认值。这里有了UI Application对象怎么又出来一个UI Application代理类对象呢?这里需要说明UI Application对象说是管理整个程序的生命周期其实它是什么具体的事情都不干,它只负责监听事件当需要做实际工作的时候就交给UI Application代理类去做,UI Application相当于传令官负责只把命令传达给UI Application代理类这个士兵,然后由这个士兵真正去冲锋陷阵,所以需要给UI Application对象设置代理类。
非常不好意思写了一堆罗嗦的文字还没有进入正题,不过这些罗嗦还是非常有必要的,现在开始编写我们的第一个iPhone程序helloWorld。上面不是说了要忘记代码模板,忘记xib忘记Interfcae Builder嘛,这样我们把模板自动生成的部分删除了,找到Other Sources文件下main.m删除,找到Classes文件夹下的Hello World Appdelegate.h和Hello World Appdelegate.m删除,把Resources文件夹下的Main Window.xib删除,还有一件事情一定要做那就是打开Resources文件夹下Hello World-info.plist,然后找到key为“Main nib file base name”删除因为在上面我们已经删除了Main Window.xib,这样就完成的工程的清理,变成了一个真正的空的工程没有什么实现代码。
完成上面的清理工作后,接下来开着我们的编写,首先新建程序入口main.m文件已经main方法,程序从这里开始!代码如下:
- int main(int argc, char *argv[]) {
- NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
- int retVal = UIApplicationMain(argc, argv, nil, @”SampleDelegate”);
- [pool release];
- return retVal;
- }
NSAutoreleasePool内存自动释放池这个干什么我就不说了,你懂得的。这里主要看一下第二行UI Application Main(argc, argv, nil, nil);与模板生成的相比改成UI Application Main(argc, argv, nil, @”SampleDelegate”);这样做我们为UI Application对象设置了名为SampleDelegate代理类,上面不是说了UI Application是不处理具体事情的,真正做事的是UI Application代理类,这个名为SampleDelegate代理类就是我们需要具体写代码实现的,当UI Application初始化后就开始监听事件,根据不同的监听事件让SampleDelegate代理类做不同的处理,比如显示第一个显示界面。
新建名为SampleDelegate.m的类,在SampleDelegate.h输入如下代码:
- @interface SampleDelegate : NSObject<UIApplicationDelegate> {
- }
- @end
注意到没有,SampleDelegate: NSObject <UIApplicationDelegate>这个写法是不是很眼熟 ,在看看最上面那段Objective-C语言的关于协议代码,SimpleClass类需要实现SimpleProtocol协议定义的方法,这样看来UIApplicationDelegate是一个协议定义,同样SampleDelegate也需要实现UI Application Delegate中定义的方法,只是这个协议是系统定义好的(具体可以参看UI Application Delegate.h)而SimpleProtocol是我们自己定义的,但是要做的事情相同,就是SampleDelegate需要去实现这UI Application Delegate协议定义好的方法, 这些方法就是UI Application对象监听到系统变化的时候通知UI Application对象代理类SampleDelegate执行的相应方法。下面是SampleDelegate的实现代码写在SampleDelegate.m中注意到没有,SampleDelegate: NSObject <UIApplicationDelegate>这个写法是不是很眼熟 ,在看看最上面那段Objective-C语言的关于协议代码,SimpleClass类需要实现SimpleProtocol协议定义的方法,这样看来UI Application Delegate是一个协议定义,同样SampleDelegate也需要实现UI Application Delegate中定义的方法,只是这个协议是系统定义好的(具体可以参看UI Application Delegate.h)而SimpleProtocol是我们自己定义的,但是要做的事情相同,就是SampleDelegate需要去实现这UI Application Delegate协议定义好的方法, 这些方法就是UI Application对象监听到系统变化的时候通知UI Application对象代理类SampleDelegate执行的相应方法。下面是SampleDelegate的实现代码写在SampleDelegate.m中:
- @implementation SampleDelegate
- - (void)applicationWillResignActive:(UIApplication *)application{}
- - (void)applicationDidBecomeActive:(UIApplication *)application{}
- - (void)applicationDidEnterBackground:(UIApplication *)application{}
- - (void)applicationWillEnterForeground:(UIApplication *)application{}
- - (void)applicationWillTerminate:(UIApplication *)application{}
- - (void)applicationDidReceiveMemoryWarning:(UIApplication *)application{}
- - (void)applicationSignificantTimeChange:(UIApplication*)application{}
- - (void)applicationDidFinishLaunching:(UIApplication*)application{}
- - (void)application:(UIApplication*)application willChangeStatusBarFrame:(CGRect)newStatusBarFrame{}
- - (void)application:(UIApplication*)application willChangeStatusBarOrientation:(UIInterfaceOrientation)newStatusBarOrientation duration:(NSTimeInterval)duration{}
- - (BOOL)application:(UIApplication*)application handleOpenURL:(NSURL*)url{
- return YES;
- }
- - (void)application:(UIApplication*)application didChangeStatusBarOrientation:(UIInterfaceOrientation)oldStatusBarOrientation{}
- - (void)application:(UIApplication*)application didChangeSetStatusBarFrame:(CGRect)oldStatusBarFrame{}
- @end
现在来看协议中定义的这些需要实现的方法分别是什么作用:
◆- (void)applicationWillResignActive:(UIApplication *)application
说明:当应用程序将要入非活动状态执行,在此期间,应用程序不接收消息或事件,比如来电话了
◆- (void)applicationDidBecomeActive:(UIApplication *)application
说明:当应用程序入活动状态执行,这个刚好跟上面那个方法相反
◆- (void)applicationDidEnterBackground:(UIApplication *)application
说明:当程序被推送到后台的时候调用。所以要设置后台继续运行,则在这个函数里面设置即可
◆- (void)applicationWillEnterForeground:(UIApplication *)application
说明:当程序从后台将要重新回到前台时候调用,这个刚好跟上面的那个方法相反。
◆- (void)applicationWillTerminate:(UIApplication *)application
说明:当程序将要退出是被调用,通常是用来保存数据和一些退出前的清理工作。这个需要要设置UIApplicationExitsOnSuspend的键值。
◆- (void)applicationDidReceiveMemoryWarning:(UIApplication *)application
说明:iPhone设备只有有限的内存,如果为应用程序分配了太多内存操作系统会终止应用程序的运行,在终止前会执行这个方法,通常可以在这里进行内存清理工作防止程序被终止
◆- (void)applicationSignificantTimeChange:(UIApplication*)application
说明:当系统时间发生改变时执行
◆- (void)applicationDidFinishLaunching:(UIApplication*)application
说明:当程序载入后执行
◆- (void)application:(UIApplication)application willChangeStatusBarFrame:(CGRect)newStatusBarFrame
说明:当StatusBar框将要变化时执行
◆- (void)application:(UIApplication*)application willChangeStatusBarOrientation:
- (UIInterfaceOrientation)newStatusBarOrientation
- duration:(NSTimeInterval)duration
说明:当StatusBar框方向将要变化时执行
◆- (BOOL)application:(UIApplication*)application handleOpenURL:(NSURL*)url
说明:当通过url执行
◆- (void)application:(UIApplication*)application didChangeStatusBarOrientation:(UIInterfaceOrientation)oldStatusBarOrientation
说明:当StatusBar框方向变化完成后执行
◆- (void)application:(UIApplication*)application didChangeSetStatusBarFrame:(CGRect)oldStatusBarFrame
说明:当StatusBar框变化完成后执行
下图是我总结的一个大概流程图,不是很准确但是基本上也说明了整个过程,仅供参考。
到这为止我们的这个程序运行起来还是什么都没有看到,确实我们也没有写具体的功能代码,接下来我们要做的就是在屏幕上显示“Hello World!”,首先知道一下要在屏幕上显示,首先需要一个UIWindow对象,这个你可以认为是一个电视机,然后还需要往这个UIWindow对象里添加UIView对象, UIView相当于电视上一幕一幕的画面。通过上面的流程知道要在程序后显示可以在applicationDidFinishLaunching方法中处理,这样修改applicationDidFinishLaunching方法如下:
- - (void)applicationDidFinishLaunching:(UIApplication*)application{
- UIWindow *window=[[UIWindow alloc]initWithFrame:[[UIScreen mainScreen] bounds]];
- SampleViewController *viewctrl=[[SampleViewController alloc]init];
- [window addSubview:viewctrl.view];
- [window makeKeyAndVisible];
- }
上面的代码中做了如下几件事情:
◆实例化了一个UIWindow对象
◆实例化了SampleViewController对象
◆把SampleViewController对象UIView对象添加到UIWindow对象中
◆显示UIWindow对象
看这段代码我们并没有直接实例化一个UIView对象然后添加给UIWindow对象而且通过SampleViewController对象,它是UIViewController子类负责视图的显示控制,非常的好用,在这里我们只是实现了loadView就够了,我们只要简单的显示一下“Hello World!”文字, 具体代码如下:
- @interface SampleViewController : UIViewController {}
- @end
- @implementation SampleViewController
- -(void)loadView{
- UIView *contentView = [[UIView alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame]];
- contentView.backgroundColor = [UIColor blackColor];
- self.view = contentView;
- [contentView release];
- CGRect labelFrame = CGRectMake(40.0f, 200.0f, 240.0f, 60.0f);
- UILabel *frontLabel = [[UILabel alloc] initWithFrame:labelFrame];
- frontLabel.text = @"Hello World!";
- frontLabel.font = [UIFont fontWithName:@"Georgia" size:24.0f];
- frontLabel.textColor = [UIColor colorWithRed:0.82f green:1.0f blue:0.286f alpha:1.0f];
- frontLabel.backgroundColor = [UIColor colorWithRed:0.0f green:0.0f blue:0.0f alpha:0.0f];
- [contentView addSubview:frontLabel];
- [frontLabel release];
- }
- @end
发表评论
-
IOS-HTML5-Video标签不能播放
2019-05-06 12:04 1509h5的video标签 在UIwebview ... -
七步配置phonegap+cordova+ionic开发环境
2016-12-19 16:21 690本文讲的是Android混合 ... -
iOS企业应用发布教程
2016-11-01 08:51 377iOS企业应用可以不经过app store发布,而可以直接在 ... -
IOS在自己网站发布APP(企业版$299上线流程)
2016-11-01 08:49 447最近刚上线一个企业内 ... -
xcode Run Script Command /bin/sh failed with exit code 1
2016-09-09 17:38 1225Xcode编译库报错:Command /bin/sh fai ... -
(二十三):Objective-C代码混淆扩展----安全攻防之代码混淆的一个小工具iOS安全攻防
2016-09-09 15:10 1172http://blog.csdn.net/yiyaaixu ... -
iOS安全–浅谈关于iOS加固的几种方法,代码混淆,类名方法名混淆等
2016-09-09 15:00 792转自:http://www.blogfshare ... -
Request获取用户真实IP
2016-09-05 11:26 563在Servlet里,获取客户端的IP地址的方法是:reque ... -
IOS UIAlertView(警告框)方法总结
2016-09-02 16:17 372摘要 在IOS8之后,UIAle ... -
iOS控件AlertView的使用
2016-09-13 10:46 427http://www.idev101.com/code/U ... -
iOS安全攻防(二十三):Objective-C代码混淆
2016-09-02 16:10 436iOS安全攻防(二十三):Objective-C ... -
iOS安全攻防(二十):越狱检测的攻与防
2016-09-02 15:23 626越狱检测的攻与防 在应用开发过程中,我们希望 ... -
iOS安全–IOS应用调试检测以及反调试
2016-09-02 15:05 1676一、检测调试 当一个应用被调试的时候,会给进程设置一个标识 ... -
iOS程序 防止动态调试和代码注入
2016-09-02 15:02 2327iPhone真实的运行环境是没有sys/ptrace.h抛出。 ... -
IOS 程序禁止被调试
2016-08-31 10:33 511IOS程序发布后,禁止被调试设置: 4.3.3开发环境 ... -
iOS设备是否越狱的判断代码
2016-08-31 10:36 508苹果是非常看重产品的安全性的,所以给用户设计了一套复杂的安全 ... -
苹果 App Store账号申请和证书申请发布app等知识
2016-07-21 15:27 810app store为开发者提供四种类型的申请: 个人i ... -
xcode 中生成和打包 ipa文件的方法和步骤
2016-07-21 15:15 506第一步:这里需要注意,要选择真机,否则Archive ... -
Xcode如何打包ipa安装包
2016-07-21 15:02 1258右键工程,选择“打开方式”->“X ... -
ios打包ipa的四种实用方法(.app转.ipa)
2016-07-21 15:01 4总结一下,目前.app包转为.ipa包的方法有以下几种: ...
相关推荐
iOS开发指南 从Hello World到App Store上架 第4版 。
《马上着手开发 iOS 应用程序》-HelloWorld 是官方帮助文档的第一个程序,入门教程参考。
IOS开发指南 从HELLO WORLD到APP STORE上架 第5版.pdf
ios通过storyboard实现helloworld显示
可以加载本地js和服务器端js 需要执行 1、pod install 2、替换sdk目录 3、npm install 文章地址:http://blog.csdn.net/dongyu0729/article/details/52104194
HelloWorld之Android应用程序详细结构介绍 HelloWorld之Android应用程序详细结构介绍HelloWorld之Android应用程序详细结构介绍
从零开始iOS8编程【HelloWorld】 配套代码:
hello world
iOS开发指南 从Hello World到App Store上架 第4版 pdf part2
iOS开发指南 从Hello World到App Store上架 第4版 pdf part3
iOS开发指南 从Hello World到App Store上架 第4版 pdf part4
IOS开发指南 从HELLO WORLD到APP STORE上架 第5版.z02
输出HELLOWORLD然后输出Helloworld最后的最后的输出Helloworld
OpenWrt之helloworld程序开发入门,里面包含helloworld和Makefile
扫描完整版带书签 iOS开发指南.从Hello World到App Store上架.第4版.part2
ios(iPhone)应用程序开发入门视频教程:第1讲helloworld概述,收录于专题《iOS(iPhone)应用程序开发入门视频教程(35讲)》
完整带书签第四版本,因为我是花了18块钱从奸商手上买的.所以,每一个分卷收5个积分,一共四个分卷,请安装7zip进行解压,无密码.
iOS开发指南 从Hello World到App Store上架 第4版。
完整带书签第四版本,因为我是花了18块钱从奸商手上买的.所以,每一个分卷收5个积分,一共四个分卷,请安装7zip进行解压,无密码.
ios helloworld