IOS技术分享
王惟琪
objective-c
面向对象的C
C语言的超集,在C基础上面加上面向对象的概念,只要是符合C的语法标准,在obj-c中都合法,(CGRet、CGSize、CGPoint)
NS前缀的objc类库 – NextStep
Cocoa Framework
Foundation Kit
(NSString、NSArray、NSDictionary…)
App Kit
(UIWindow、UIView、UIViewController、UIButton…)
部分obj-c特性
无命名空间特性,为防止与其他类库命名相冲突,项目组中更多的是以约定的命名前后缀来区分,如公司域名
Import & implementation
java—package
C# -- using
C – include
point
作为C最经典、最核心、最难的一部分,obj-c依然保留了下来,同时要求更严格,编程过程中,objc里面任何对象都以指针的形式操作,且只允许以指针的形式操作
Block
(void) downloadImage:(NSInteger) progress finished:(void^(void)) block;
类似于javascript里面的回调函数,如:jquery中
$.post(url, data, success(data){ dosomething… });
@Select
(void) func:(SEL) methodName;
类似C语言中的函数指针和C#里面的委托
@property & @synthesize (Xcode)
C# --属性
Java – get、set方法
Delegate(更像一种设计模式)
将本该由自己实现的方法,交给其他类去实现,自己只约定标准
如:UITableDelegate、UITableDataSouce
Notification(压根儿就是一种设计模式)
整个App中定义一个NotificationCener,将对象加入observer中后,其他对象只要App发出符合要求的notification就可以触发指定的操作
Java -- addListener
简写语法(Xcode,ios 6 SDK)
对象初始化
以前:NSNmuber *num = [NSNmuber numberWithFloat: ];
现在:NSNumber *num = @; (@YES、@’A’、@10……)
数组
以前:NSArray *array = [NSArray alloc] initWithObjects:@”A”,@”B”,nil];
现在: NSArray *array = @[@”A”,@”B”];
访问数组元素
以前:[array objectAtIndex:0];
现在:array[0]; array[0] = @”girl”;
键值对
以前; NSDictionary *dic=
[NSDictionary dictionaryWithObjectsAndKeys: object1, key1, object2, key2, object3, key3, nil];
现在: NSDictionary *dic= {key1 : object1, key2 : object2, key3 : object3};
元素访问:dic[@key]
感觉越来越像 C# 和 javascript的语法了........
Obj-c内存管理
指针,手动管理内存机制
GC apple尝试采用类似java、.net的系统垃圾回收机制,程序自动回收内存,但最终还是废除了,原因:影响性能
ARC 和 MRC
MRC手动引用计数:类存管理的开辟与释放完全有程序员自己控制……
头疼的空指针错误和内存溢出….
App运行过程中莫名其妙的就退出了…
ARC自动引用计数:像.net、java一样编程?其实最终程序的内存管理还是在代码中处理的,并非系统回收内存,但编译器智能的猜测出了你的那些地方需要加上内存释放的代码
代码编写方式稍有不同
部分新关键字 __weak、 __strong 、 __bridge
ARC Only for NSObject
在ARC的机制中只对object-c类型的对象才有效,而C类型需要释放的变量仍然需要手动释放
ARC 终将取代MRC
很多开源的类库框架已经采用了ARC,但仍有部分是MRC
项目中可以使用ARC和MRC混合模式编程(Xcode)
内存管理基本原则
任何你创建的对象你都获得其所有权。(包括 alloc ,new ,copy等关键字获得的对象)
通过retain获得对象的所有权
如果你不需要一个对象了,你必须释放所有权
你不能释放你没有所有权的对象
NSAutoRealesePool自动释放池
托管需要释放的对象,在对象引用计数为0后释放对象
Autorealse:在将来的某个时候释放对象,如:方法需要返回一个需要释放的对象
官方内存管理实例:
ARC使用:
Xcode内存分析功能
Profile
从代码上面分析会产生的内存问题
Analyze
App运行过程中记录系统内存溢出位置
Xcode实例演示
IOS框架
核心操作系统层(Core OS layer):
内存管理、文件系统、电源管理以及一些其他的操作系统任务、直接和硬件设备进行交互
核心服务层(Core Services layer):
iOS的一些服务
媒体层(Media layer)
音频与视频的录制,图形的绘制,以及制作基础的动画效。
可触摸层(Cocoa Touch layer)
Cocoa Touch是可触摸层用户界面
Xcode基本操作
生命周期
UIViewController 生命周期
App生命周期
Q&A
Over,3Q