一、获取当前日期和星期
// get the current date
NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
[dateFormat setDateFormat:@"yyyy-MM-dd"];
NSDate *now = [[NSDate alloc] init];
// get the weekday of the current date
NSCalendar* cal = [NSCalendar currentCalendar];
NSDateComponents* components = [cal components:NSWeekdayCalendarUnit fromDate:now];
NSInteger weekday = [components weekday]; // 1 = Sunday, 2 = Monday, etc.
二、.[[UIDevice currentDevice] orientation] 获取设备状态
[[UIDevice currentDevice] orientation] 通过这个获取设备状态是有以下七个状态:
UIDeviceOrientationUnknown
UIDeviceOrientationPortrait //Device oriented vertically, home button one the button
UIDeviceOrientationPortraitUpsideDown //Device oriented vertically, home button one the top
UIDeviceOrientationLandscapeLeft //Device oriented horizontally,home button on the right
UIDeviceOrientationLandscapeRight //Device oriented horizontally, home button on the left
UIDeviceOrientationFaceUp //Device oriented flat, face up
UIDeviceOrientationFaceDown //Device oriented flat, face down
在有第一个和最后两个状态的情况下,如果是在状态发生变化的时候去做一些操作,那么是没问题的,因为操作的时候只捕获四个旋转状态即可。但是如果要根据在做操作的时候根据状态去做某些事情就会有问题,因为非常有可能取到那三个非旋转状态。解决方案:记住上一个旋转状态,当发现获取的状态不是四个旋转状态的时候,使用上一个正常旋转状态。
示例代码:
- (void)applicationDidFinishLaunching:(UIApplication *)application {
[window addSubview:crateViewController.view];
[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(orientationChanged:)
name:@"UIDeviceOrientationDidChangeNotification" object:nil];
}
- (void)orientationChanged:(NSNotification *)notification
{
UIInterfaceOrientation orientation = [[UIDevice currentDevice] orientation];
if (UIDeviceOrientationIsPortrait(orientation) || UIDeviceOrientationIsLandscape(orientation))
{
if (!currentOrientation)
{
currentOrientation = orientation;
[self prepareScreen];
}
currentOrientation = orientation;
}
[[UIApplication sharedApplication] setStatusBarOrientation:currentOrientation animated:YES];
}
三、多线程之NSInvocationOperation
多线程主要是为了防止主线程堵塞,增加运行效率等等的最佳方法,而在原始的多线程中可能会造成线程锁死等现象,在Cocoa中,Apple提供了NSOperation这个类,提供了一个优秀的多线程编程方法。首先简单介绍一下Apple提供给我们的API。
多线程API介绍
NSOperation |
基类,用来自定义operation object。继承NSOperation 可以完全控制operation object 的实现,包括修改操作执行和状态报告的方式等。 |
NSInvocationOperation |
可以直接使用的类,基于应用的一个对象和selector来创建operation object。如果你已经有现有的方法来执行需要的任务,就可以使用这个类。 |
NSBlockOperatin |
可以直接使用的类,用来并发的执行一个或者多个block对象,operation object 使用“组”的语义来执行多个block对象,所有相关的block都在执行完成之后,operation object才算完成。 |
下面是一段使用
NSInvocationOperation的示例代码:
@implementation MyCustomClass
- (void)launchTaskWithData:(id)data
{
//创建一个NSInvocationOperation对象,并初始化到方法
//在这里,selector参数后的值是你想在另外一个线程中运行的方法(函数,Method)
//在这里,object后的值是想传递给前面方法的数据
NSInvocationOperation* theOp = [[NSInvocationOperation alloc] initWithTarget:self
selector:@selector(myTaskMethod:) object:data]; //下面将我们建立的操作“Operation”加入到本地程序的共享队列中(加入后方法就会立刻被执行)
// 更多的时候是由我们自己建立“操作”队列
[[MyAppDelegate sharedOperationQueue] addOperation:theOp];
}
// 这个是真正运行在另外一个线程的“方法”
- (void)myTaskMethod:(id)data
{
// Perform the task.
}
@end
一个NSOperationQueue
操作队列,就相当于一个线程管理器,而非一个线程。因为你可以设置这个线程管理器内可以并行运行的的线程数量等等。下面是建立并初始化一个操作队列:@interface MyViewController : UIViewController {
NSOperationQueue *operationQueue;
//在头文件中声明该队列
}
@end
@implementation MyViewController
- (id)init
{
self = [super init];
if (self) {
operationQueue = [[NSOperationQueue alloc] init]; //初始化操作队列
[operationQueue setMaxConcurrentOperationCount:1];
//在这里限定了该队列只同时运行一个线程
//这个队列已经可以使用了
}
return self;
}
@end
四、如何在应用程序中发送邮件
3.0以前使用mailto URL,但是会退出当前应用程序
3.0后Apple提供了MessageUI framework可以在我们的应用程序内实现邮件发送功能,代码示范参见:
https://developer.apple.com/iphone/library/samplecode/MailComposer/index.html
可以添加附件和以HTML格式发送邮件。
如果想要在邮件中添加URL如:http://ditu.at/tinyurl
可以如下编码:
// Fill out the email body text
NSString *emailBody = [[NSString alloc]init];
NSArray *arSubviews = [shareView subviews];
UITextField *tvMessage = [arSubviews objectAtIndex:4];
emailBody = [NSString stringWithFormat:@"%@,%@ <a href = '%@'>%@</a>", tvMessage.text, NSLocalizedString(@"FOR_DETAILS",@""),
[self.tinyURLList objectAtIndex:0],[self.tinyURLList objectAtIndex:0]];
如果想在邮件中提供你的App Store应用程序链接,可如下编码:
NSString *pageLink = @"http://mugunthkumar.com/yourapp";
NSString *iTunesLink = @"http://link-to-yourapp";
NSString *emailBody =
[NSString stringWithFormat:@"%@\n\n<h3>Sent from <a href = '%@'>your app</a> on iPhone. <a href = '%@'>Download</a> yours from AppStore now!</h3>", @"test url", pageLink, iTunesLink];
最后一定记住使用html格式:
[mailPicker setMessageBody:emailBody isHTML:YES];
[self presentModalViewController:mailPicker animated:YES];
五、深刻理解一下IOS SDK 和 Objective-c
iPhone OS
iPhone OS 由4个主要部分组成。下面简单地罗列一下它们的功能。
Cocoa Touch
-
窗口和视图
-
事件管理
-
用户接口
-
加速传感器
-
照相机
Media
-
Core Graphics(2维图形接口)
-
Core Animation(动画)
-
OpenGL
-
Core Audio(声音)
-
OpenAL
-
Media Player(MPEG4,MP3)
Core Services
-
Address Book
-
Core Foundation
-
Core Location
-
CFNetwork(http,https,ftp,SSL,TLS)
-
网络安全
-
SQLite(SQL数据库)
-
XML
Core OS
-
多线程
-
网络应用(BSD套接字)
-
文件系统
-
Bonjour(利用无线网络连接其他机器)
iPhone SDK
iPhone SDK 中主要包含下列4个工具。
-
Xcode - 项目管理、代码编辑、编译、调试(IDE)
-
Interface Builder - GUI 设计
-
iPhone Simulator - 模拟器
-
Instrument - 性能测试、调整
实际开发的过程中,基本上是在使用 Xcode 与 Interface Builder 来进行的。调试则是使用模拟器或者实际设备。要注意的是在PC上模拟程序,由于PC的主频,性能高于实际设备,所以不能只在模拟器上调试。除此之外,一些类,功能在模拟器上也是不能使用的,比如 NSDateCalendar 类,或者是照相机功能。
Objective-C 2.0
内存管理
虽然 Objective-C 2.0 已经支持了垃圾收集了,但是 iPhone OS 中却不能使用它。所以我们需要自己来管理内存。Objective-C 的内存管理方式与使用引用计数的方式,就是说对象有一个计数器,引用对象一次,计数器加一,当计数器为0的时候,该对象的内存被释放。
创建对象实例的时候(init,alloc)应用计数加一,执行过程中,别的对象如果需要该对象,需要用(retain)来引用它,这时,该对象的应用计数器加一。不需要对象的时候用(release)来释放,这时引用计数器减一,当计数器为0的时候,释放该对象内存。
-
init,alloc - 计数器 +1
-
retain - 计数器 +1
-
release - 计数器 -1
另外如果不使用 retain,release,可以使用(autorelease)来自动释放对象。
容器
Objective-C 中的容器主要有以下3种:
向容器中添加的内容不能直接用 int 或 float,需要通过 NSNumber 等封装类来实现。Objective-C 2.0 开始可以使用迭代子(Enumerator),来顺序访问容器中的元素。
Notification
Notification是消息通知的功能。具体使用 NSNotificationCenter 类。将需要接受通知的对象,方法,事件注册到该类上。
归档(Archive)
归档是指将对象的内存布局原样地保存到文件系统上。同样对应的由文件中的数据生成对象叫做UnAchive。在 iPhone SDK 中使用 NSKeyedArchiver 和 NSKeyedUnarchiver 类来实现。
一般在程序结束的时候,保存当前的状态,再次启动的时候UnAchive一下,就又回到了刚才退出时的状态。下面是一个例子:<示例代码来自网络>
// MyKeyedArchiver.h
#import <Cocoa/Cocoa.h>
@interface NSKeyedArchiver (MyKeyedArchiver)
- (void)encodeValueOfObjCType:(const char *)valueType at:(const void *)address;
@end
#import "MyKeyedArchiver.h"
@implementation NSKeyedArchiver (MyKeyedArchiver)
- (void)encodeValueOfObjCType:(const char *)valueType at:(const void *)address
{
NSMutableData *datas = [NSMutableData data];
NSArchiver *arch = [[NSArchiver alloc] initForWritingWithMutableData:datas];
[arch encodeValueOfObjCType:valueType
at:address];
[self encodeObject:[NSData dataWithData:datas]];
[arch release];
}
@end
// MyKeyedUnarchiver.h
#import <Cocoa/Cocoa.h>
@interface NSKeyedUnarchiver (MyKeyedUnarchiver)
- (void)decodeValueOfObjCType:(const char *)valueType at:(void *)data;
@end
#import "MyKeyedUnarchiver.h"
@implementation NSKeyedUnarchiver (MyKeyedUnarchiver)
- (void)decodeValueOfObjCType:(const char *)valueType at:(void *)data
{
NSData *datas = [self decodeObject];
NSUnarchiver *unarch = [[NSUnarchiver alloc] initForReadingWithData:datas];
[unarch decodeValueOfObjCType:valueType
at:data];
[unarch release];
}
@end
分享到:
相关推荐
本文档是根据我最近两年ios开发常用知识点总结而来,涉及ios客户端开发的各个知识点以及网络通讯相关知识,非常适合初学者学习以及项目开发者参考。
黑马iOS往期学员,总结面试所需知识点,基本全包括!C,OC,Foundation!
swift知识点梳理,个人笔记。包含常量与变量、基本数据类型,以及Swift语言中的新数据类型—元组型和可选型的内容。同时还讲解了运算符和表达式、流程控制语句、字符和字符串、集合类型、函数和闭包。此外,Swift...
有很多的ios开发中会遇到的知识点和开发技巧,对于开发人员 绝对有帮助
这份文档是我从事ios开发一年以来,总结工作中常用到的100余个ios小知识点,并添加可以调试观看的实例代码,方便iso开发者学习和交流,弄清楚这些,基本从事ios开发没什么问题。另文档中附有移动应用开发开发入门...
简单的开发知识点总结吧,供新人学习参考使用。
如果是刚接触Swift的话,可以看一下这个项目,适合新手快速用Swift熟悉UI。
本文件是本人从事ios开发一年以来,总结工作中常用到的100余个ios小知识点,并添加可以调试观看的实例代码,方便iso开发者学习和交流,弄清楚这些,基本从事ios开发没什么问题。欢迎大家下载及补充!!!!!!
主要给大家介绍了关于iOS开发之实用小知识点的相关资料,其中包括防止UIButton,cell等重复点击、获取当前视图最顶层的ViewController以及代码截图相关的等知识,需要的朋友可以参考借鉴,下面随着小编来一起学习...
这份文档是我从事ios开发一年以来,总结工作中常用到的100余个ios小知识点,并添加可以调试观看的实例代码,方便iso开发者学习和交流,弄清楚这些,基本从事ios开发没什么问题。
这份文档总结工作中常用到的100余个ios小知识点,并添加可以调试观看的实例代码,方便iso开发者学习和交流,弄清楚这些,基本从事ios开发没什么问题。 不错的笔记,里面知识点很多,涉及了很多方面的基础知识,也...
在本篇文章里小编给各位整理了关于iOS开发如何避免安全隐患的知识点总结,需要的朋友们学习下。
这里把目前主要做的iOS端常用知识点总结下,便于后续开发拿来直接用; ii、后续会陆续贴出完整的复习笔记,有需要联系作者; (二十八) iOS Tencent/WCDB-增删改查 2021年01月06日10:16:51 2021年01月06日09:31:03 2021...
SDK集成:掌握各平台的软件开发工具包(SDK)集成方法,如Google Mobile Services、Apple iOS SDK等。 界面设计:遵循Material Design(Android)和Human Interface Guidelines(iOS)进行界面布局与交互设计。 ...
千锋ios培训面试题总结 近三年面试题精华 重点知识点 常考知识点 培训的时候老师就保证这个面试题保证笔试百分之百的通过率 并且还有面试常问的问题 是千锋培训的面试宝典 请相信物有所值 只要看完了笔试秒杀
这份文档是我从事ios开发一年以来,总结工作中常用到的200余个ios小知识点,并添加可以调试观看的实例代码,方便iso开发者学习和交流,弄清楚这些,基本从事ios开发没什么问题。
:sign_of_the_horns: 前言这是我在学习iOS开发相关内容过程中的总结,包括在日常coding、工作中、灵光一闪后的想法实践等都会在此进行分析总结。欢迎star、fork、PR。,当初开这个库时的一些想法。:Japanese_castle:...
本课程以帮助学员面试 iOS 开发高级工程师为目标,从 runtime、runloop、消息转流程、UI 绘制原理、常考算法题和设计模式等角度,对面试中常被考的知识点做讲解和总结,希望大家更快拿到高薪 offer。