概述:

iOS是苹果开发的手持设备操作系统(iPhone,iPad,iPod touch,iPad mini)。

基于UNIX,层次架构:核心操作系统层(Core OS)—> 核心服务层(Core Services)—>媒体层(Media)—>可触摸层(Cocoa Touch);

主要面对Cocoa Touch层;很多技术都是基于OC,底层很多框架是C开发的;Cocoa Touch层中的UIKit框架,为应用提供了各种可视化的组件如,窗口(UIWindow),视图(UIView)和按钮(UIButton);还提供了其他有用的框架,如拍照,照片,感测器,陀螺仪等硬体支持框架。

iOS 可直接与底层硬体通信(区别与android是没有虚拟机);系统底层,应用框架,应用软体都是用CC++或OC写的,所有运行效率高。

同android ,一个包名对应一个唯一应用;

retina 视网膜屏幕,只有3.5和iphone4才有;

每一个应用程序都有属于自己的UIWindow;(IOS采用MVC模式)

UIView:视图。屏幕上可以看的看的东西都是UIView,如标签,文本,按钮(同android中的View),都是继承自UIView。

UIViewController(控制器) : 内部默认有个UIView视图;用于控制UIView这间的切换;管理UIView的生命周期;给UIView装配数据;处理UIView的事件处理;(类似android中的Activity)

++ 虚拟机 ++

shift+cmd+H(单次):退回桌面(home)

shift+cmd+H(两次):最近运行的软体并可关闭

运行原理:

入口 main.m中的main函数;再执行UIApplicationMain函数(先创建一个UIApplication实例(同android中的application,也是单例的);创建完成后马上开启一个消息循环(main loop)(故main方法永远没有返回),用来监听用户的操作;是应用程序的象征;再创建一个UIApplication的delegate对象,负责监听UIApplication的生命周期,当UIApplication生命周期发生改变时会向UIApplicationDelegate发送不同的消息);

运行过程:

第一次打开:didFinishLaunchingWithOptions(载入完毕)—> applicationDidBecomeActive(获取焦点);

当按home键时:applicationWillResignActive(失去焦点)—>

applicationDidEnterBackground(进入后台);

当再次点击应用图标重新进入应用时:applicationWillEnterForeground(进入前台)—> applicationDidBecomeActive(获取焦点);

main方法中返回:

//创建application和代理后,再开启一个消息循环。

UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]))

参数:

第3个参数:指定UIApplication的类名(或子类),若为nil,默认就是UIApplication;

第4个参数:指定UIApplication代理的类名;

///应用载入完毕时调用

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

//初始化一个窗口,默认下一个程序对应一个程序,并载入页面

self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];

//初始化一个控制器,指定xib的名字;并设置到窗口的根控制器

//相当于[self.window addSubview:self.viewController.view]

self.window.rootViewController = [[[ViewController alloc] initWithNibName:@"ViewController" bundle:nil] autorelease];

//窗口默认不会显示,需要调用方法来显示

//在众多窗口,会有一个主窗口(KeyWindow),只有主窗口才能跟用户交互

//与self.window.hidden=NO区别在于能与用户进行交互

[self.window makeKeyAndVisible];

return YES;

}

将事件与按钮关联:

创建一个xib文件,插入文本和按钮;

用连线的方式关联view与viewController;

在当前ViewController对应的.h文件中声明文本控制项和按钮的响应名

//将文本控制项当作类的成员变数,不需要自己管理内存,由View管理内部所有view的生命周期,故对UI控制项可直接赋值,不需要retain

//用IBOutlet可显示在xib的列表中

@property (nonatomic,assign)IBOutlet UITextField *qq;

@property (nonatomic,assign)IBOutlet UITextField *pwd;

//定义一个按钮的方法,IBAction就是void,可关联到显示到xib文件右击列表

-(IBAction)login;

在xib中将控制项和定义的控制项变数名(事件方法)用连线的方式关联起来;

在.m中实现函数即可

收起键盘方法:哪个控制项调起,则由哪个控制项收回;(为防止控制项被键盘覆盖,1.可修改控制项的y值;2.使用scollView);

-(void)login{

NSString *qqtext = _qq.text;

NSString *pwdtext = _pwd.text;

NSLog(@"*** login ****,%@,%@",qqtext,pwdtext);

//暂时理解,调出键盘的那个视图就是第一个响应者(FirstResponder)

//1.代表不想当第一响应者,就会收起键盘;//也可遍历退出

[_qq resignFirstResponder];

[_pwd resignFirstResponder];

//2.若第一响应者存在于self.view里面(包括所有子孙节点控制项),就可以退出键盘;

[self.view endEditing:YES];

}

— weak —:(类似于java中弱引用)相当于老版本的assign,指针变数仍然可以指向一个对象,但不属于对象的拥有者,一般ViewController对UI控制项都是弱引用,View消失,则其中所有控制项消失,不会引起野指针错误;仍然可以指向一个对象,但不属于对象的拥有者。即当对象被销毁的时候,这个weak指针也就自动指向nil(空指针)。

— strong —:(类似于java中强引用)相当于retain,具有持对象的能力;能够保持对象的生命,一个对象只要有strong指针指向它,那么它就不会被释放;相反的,如果一个没有一个strong指针指向它,那么它将会被自动释放。默认所有实例变数和局部变数都是Stong指针

*保留连环(retain cycle)*:两个或更多对象以一种连环的方式相互拖持有,和个对象且个值为1或更大值的引用计数,因此它们的的指针永远不会释放,所有保留连环中的对象也从不会被销毁。为避免这种情况,在创建的时候须考虑好是谁创建谁,并一定使用weak关键字。即可使用所有者对象持有另一个对象,但另一个对象绝不会持有它的所有者。

从IOS5.0开始,使用storyboard来描述界面(但实际开发时多人开发容易冲突,使用xib可为单个viewController创建)

设置启动的主界面(main storyboard): 项目targets —> Deployment info—> Main Interface;

启动过程:

载入最主要的storyboard文件—>创建viewController —>创建控制器内部的View,并显示。

UIViewController与UIView的关系:UIViewController内部都有个UIView对象,就是管理的view;

新版本SDK开的新功能不一定能在低版本的ios版本上实现(同android);

++ UIView ++控制项外部的(0,0)是控制项父控制项的左上角。直接在storyboard,直接拖动,在列表中的控制项越靠后越在上。

常用属性:

- frame - 位置和尺寸(以父控制项的左上角为原点(0,0)),宽高位置都能更改

- center- 中点 (以父控制项的左上角为原点(0,0))也可用于改变位置

- bounds- 位置和尺寸(以自己的左上角为原点 (0,0)),只能改宽高,不能改位置

- transform - 形变属性(缩放,旋转)

- backgroundColor - 背景颜色

- tag - 标识

-tag-:在view下,设置控制项的tag(类似于android的id),若多个按钮点击同一个方法,则可区别是哪个控制项点击的。

- hidden - 设置是否要隐藏

- alpha - 透明度(0~1);

- opaque - 不透明度(0~1);

- userInteractionEnabled - 能否跟用户进行交互(YES 能交互)

- superView - 父控制项

- subviews - 子控制项

- contentMode - 内容显示的模式 拉伸自适应

[不能直接修改对象内部的结构体的属性值]

++ 设置代码模块 ++

左键长按代码块 到TextSetting的花括弧中,并设置其名称和快捷键(不是设置键盘上的按键,是直接先快捷代码命令,如btn-set)

- UIButton 与UIImageView的区别:

UIButton有background属性,而UIImageView只有image属性。

[雷同于android中的ImageView和Button]

[Button有同android中TextView左右添加图片的属性]

UIImageView 继承自UIView就不能监听操作事件;

— 所有控制项,只要继承UIControl都能监听屏幕操作事件;通过addTarget:<#(nullable id)#> action:<#(nonnull SEL)#> forControlEvents:<#(UIControlEvents)#>可添加事件监听;

若不用tag进行标识点击的是哪个按钮,可用字典文本的方式:新建一个字典plist,添加按钮文本和int型的value;将按钮上的文字设置成对应的字典中的key并设置其颜色为clear color;在点击事件中用按钮上的文字从字典中取出value再添加操作方法。

[*区域点击可考虑使用透明按钮]

— 两种方式载入图片:

[使用Product—Profile—Allocations 来进行内存使用监控]

[UIImage imageNamed@「」]该方法是系统方法(有缓存),载入图片后不会自动释放内在。图片先载入到内存中,使用后再放入缓存中,若没有释放,载入大量图片则会使内存撑爆。

[[UIImage alloc] initWithContentsOfFile:<#(nonnull NSString *)#>]无缓存,使用完成后会自动释放(但不是马上释放,会找个合适的时候释放),减小内存消耗;[使用该方法]


推荐阅读:
相关文章