- 浏览: 579311 次
- 性别:
- 来自: 广州
文章分类
最新评论
-
JYY282:
[i][/i]
Ecshop与Shopex的比较 -
qq247890212:
我也遇见这问题了,真诡异。重新下载个猫换了就好了。 太浪费时间 ...
诡异:ClassNotFoundException: org.springframework.web.filter.CharacterEncoding
From: http://lishuaishuai.iteye.com/blog/1045218
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 函数中第二行代码UIApplicationMain(argc, argv, nil, nil); 对UIApplication 对象进行了初始化,这个方法除了argc 和 argv 参数外,另外这个函数还有2 个两个字符串参数来识别:
Ø UI Application 类
Ø UI Application 代理类
在这里默认是2 个nil, 第一个参数为nil 就默认把UI Application 类作为缺省值进行初始化,可以在这里不填nil 而是使用自己定义的UI Application 子类。至于第二个参数nil 就设置为nil 就把模板生成的HelloWorldAppdelegate 类作为默认值。这里有了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 内存自动释放池这个干什么我就不说了,你懂得的。这里主要看一下第二行UIApplicationMain(argc, argv, nil, nil); 与模板生成的相比改成UIApplicationMain(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 中
@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 willChangeStatusBarOrientation:(UIInterfaceOrientation)newStatusBarOrientation duration:(NSTimeInterval)duration
说明:当StatusBar框方向将要变化时执行
◆
- (void)application:(UIApplication)application willChangeStatusBarFrame:(CGRect)newStatusBarFrame
说明:当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];
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];
self.view = contentView;
[contentView release];
}
@end
下图是我总结的一个大概流程图,不是很准确但是基本上也说明了整个过程,仅供参考:
发表评论
-
Objective-C 与 C++ 的异同
2013-04-02 12:03 1391http://www.cnblogs.com/y041039 ... -
Cocos2D-X是全球知名的开源跨平台手机游戏引擎
2013-01-22 10:05 2746http://www.oschina.net/p/cocos ... -
iOS Keyboard 键盘高度变化 自适应
2013-01-15 15:43 3244[[NSNotificationCenter default ... -
iOS使用自定义字体
2012-11-27 12:11 12131From: http://blog.csdn.net/csy1 ... -
4 款类似 Facebook/Path 切换效果的 iOS 组件
2012-11-27 12:03 2171From: http://blog.csdn.net/lia ... -
Path 2.0的UI界面设计详细介绍
2012-11-27 11:56 1456如Path的创始人Dave Morin ... -
史上最全的App Store邮箱列表
2012-11-27 11:51 1264From: http://roybaby.blog.51cto ... -
iOS从info.plist 获取项目的名称及版本号
2012-11-16 10:54 1656From: http://blog.sina.com.cn/s ... -
MapKit annotation drag and drop with callout info update
2012-10-13 10:38 2396http://hollowout.blogspot ... -
NSArray 或NSDictionary 调用writeToFile方法失败原因
2012-08-31 10:03 4459NSArray 或NSDictionary 调用writeTo ... -
如何让IOS应用从容地崩溃
2012-08-30 15:25 1612From: http://www.cocoachina.com ... -
iOS中判断设备系统版本
2012-08-29 17:17 31706在iOS开发中,经常要考虑系统的向下兼容,如果使用 ... -
iOS 汉字转拼音
2012-08-21 16:42 1461From: http://www.cnblogs.com/v2 ... -
iOS模拟器截图工具
2012-08-17 16:35 1645From: http://magicalboy.com/ios ... -
XCode下的iOS单元测试
2012-08-10 17:47 1157From: http://mobile.51cto.com/ ... -
AFNetworking
2012-08-08 10:54 4644AFNetworking on github: https:/ ... -
Wrapping Conventions
2012-08-01 15:54 818Wrapping Conventions ... -
Core Animation如何使显式动画结束时的值直接作用Layer
2012-08-01 14:51 3790(1)使用隐式动画会直接改变layer的属性值,如: ima ... -
How To Debug Memory Leaks with XCode and Instruments Tutoria
2012-07-31 16:30 1050From: http://www.raywenderlich. ... -
Using Properties in Objective-C Tutorial
2012-07-31 16:27 918From: http://www.raywenderlich. ...
相关推荐
iOS应用程序生命周期知识点总结 iOS应用程序生命周期是指应用程序从启动到终止的整个过程。这个过程中,应用程序会经历多个状态,例如启动、激活、暂停、后台等。了解应用程序生命周期是开发iOS应用程序的基础。 ...
iOS应用程序的生命周期是指iOS应用从启动到运行,再到停止或者进入后台,以及之后的再次激活或被终止的整个过程。iOS应用的生命周期管理涉及到多个关键对象和方法,开发者需要理解这些对象的职责和方法的调用时机,...
iOS的应用程序的生命周期,还有程序是运行在前台还是后台,应用程序各个状态的变换,这些对于开发者来说都是很重要的。 iOS系统的资源是有限的,应用程序在前台和在后台的状态是不一样的。在后台时,程序会受到系统...
在iOS开发中,应用程序生命周期是每个开发者都需要深入理解的关键概念。这个项目,"iOSAppLifeCycleTest",显然是一个用于探索和测试iOS应用在不同场景下生命周期行为的实验平台。我们将主要聚焦于Swift编程语言环境...
每个人都试图在其应用程序生命周期的某个时刻实现缓存,这就是我们的事。 这是一个库,允许人们使用生存时间(TTL)值和语义来缓存NSData进行磁盘管理。 ? 每个人都试图在其应用程序生命周期的某个时刻实现缓存,这...
"awsome-ios-interview-question-testCode"这个项目显然聚焦于iOS应用程序的生命周期,特别是从面试的角度来探讨这一核心概念。让我们深入研究一下iOS应用生命周期中的关键知识点,并通过实践代码来加深理解。 首先...
#### 应用程序生命周期 在iOS应用开发中,了解应用程序的生命周期非常重要。这涉及到应用程序启动、运行、暂停、终止等多个状态及其转换过程。熟悉这些状态有助于优化应用性能,提供更好的用户体验。 #### 应用...
此外,本书还会涉及iOS应用的生命周期管理,包括应用的启动、挂起、恢复和终止状态。开发者需要了解如何保存和恢复应用的状态,以便在用户切换到其他应用或设备休眠后,仍能保持良好的用户体验。 在数据存储方面,...
本文档基于给定的“iOS学习笔记”,深入探讨iOS应用程序生命周期的关键概念、阶段以及如何处理这些阶段。 #### 二、基础知识 **1.1 入口点:** iOS应用的入口点位于`main.m`文件中的`main`函数。此函数通过调用`...
每个人都试图在其应用程序生命周期的某个时刻实现缓存,这就是我们的事。 这是一个库,允许人们使用生存时间(TTL)值和语义来缓存NSData进行磁盘管理。 :mobile_phone: iOS 8.0以上 :laptop: OS X 10.10以上 建筑...
程序生命周期涉及到从应用程序启动、运行、暂停、后台处理、恢复直至关闭的全过程。对于iPhone开发来说,掌握这个生命周期有助于编写更加高效和响应良好的应用。 首先,让我们回顾一下Objective-C中的协议...
本篇文章将深入探讨iOS应用程序管理的实现方法,帮助开发者理解和构建类似功能。 首先,我们从项目名称“应用管理”出发,可以理解这是一个用于管理用户设备上应用的应用程序。在iOS平台上,管理应用通常包括展示...
### 25个增强iOS应用程序性能的提示与技巧(初级篇) #### 一、使用ARC进行内存管理 **ARC(Automatic Reference Counting)**是一种自动内存管理机制,它首次出现在iOS 5中,旨在帮助开发者解决内存管理的问题。...
本篇文章将深入探讨Delphi iOS应用程序的生命周期,以及如何处理后台模式。 首先,让我们了解iOS中应用程序的基本生命周期阶段。这些阶段包括: 1. **初始化**:当应用程序第一次启动时,`AppDelegate`类的`...
应用程序的生命周期
《Swift 4开发iOS应用》是针对最新Swift 4编程语言和iOS SDK的一本详尽教程,旨在帮助开发者深入理解如何使用Swift 4构建高效、功能丰富的iOS应用程序。该资源来源于"Beginning iPhone Development with Swift 4: ...
iOS应用程序一般都是由自己编写的代码和系统框架(systemframeworks)组成,系统框架提供一些基本infrastructure给所有App来运行,而你提供自己编写的代码来定制App的外观和行为。因此,了解iOSInfrastructure和它们...
《iOS应用程序开发官方手册》是苹果公司为开发者提供的详尽指南,旨在帮助开发者掌握iOS平台上的应用程序开发技术。这份手册涵盖了从基础概念到高级特性的全方位内容,是学习和提升iOS开发技能的重要参考资料。 ...