`
java-mans
  • 浏览: 11414107 次
文章分类
社区版块
存档分类
最新评论

再来IOS开发小知识点总结

 
阅读更多

一、获取当前日期和星期

// 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种:

  • 数组
  • 字典
  • Set

向容器中添加的内容不能直接用 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客户端开发的各个知识点以及网络通讯相关知识,非常适合初学者学习以及项目开发者参考。

    黑马iOS知识点全总结

    黑马iOS往期学员,总结面试所需知识点,基本全包括!C,OC,Foundation!

    IOS开发&&swift知识点梳理及总结

    swift知识点梳理,个人笔记。包含常量与变量、基本数据类型,以及Swift语言中的新数据类型—元组型和可选型的内容。同时还讲解了运算符和表达式、流程控制语句、字符和字符串、集合类型、函数和闭包。此外,Swift...

    ios开发技巧和知识点总结

    有很多的ios开发中会遇到的知识点和开发技巧,对于开发人员 绝对有帮助

    苹果iOS开发工作笔记(从事iOS开发一年所总结的常用知识点)

    这份文档是我从事ios开发一年以来,总结工作中常用到的100余个ios小知识点,并添加可以调试观看的实例代码,方便iso开发者学习和交流,弄清楚这些,基本从事ios开发没什么问题。另文档中附有移动应用开发开发入门...

    ios开发知识点

    简单的开发知识点总结吧,供新人学习参考使用。

    swift-iOS常用的知识点总结

    如果是刚接触Swift的话,可以看一下这个项目,适合新手快速用Swift熟悉UI。

    一年ios开发的工作总结笔记

    本文件是本人从事ios开发一年以来,总结工作中常用到的100余个ios小知识点,并添加可以调试观看的实例代码,方便iso开发者学习和交流,弄清楚这些,基本从事ios开发没什么问题。欢迎大家下载及补充!!!!!!

    iOS开发之一些实用小知识点总结

    主要给大家介绍了关于iOS开发之实用小知识点的相关资料,其中包括防止UIButton,cell等重复点击、获取当前视图最顶层的ViewController以及代码截图相关的等知识,需要的朋友可以参考借鉴,下面随着小编来一起学习...

    苹果ios开发一年的工作笔记

    这份文档是我从事ios开发一年以来,总结工作中常用到的100余个ios小知识点,并添加可以调试观看的实例代码,方便iso开发者学习和交流,弄清楚这些,基本从事ios开发没什么问题。

    苹果ios开发一年工作笔记

    这份文档总结工作中常用到的100余个ios小知识点,并添加可以调试观看的实例代码,方便iso开发者学习和交流,弄清楚这些,基本从事ios开发没什么问题。 不错的笔记,里面知识点很多,涉及了很多方面的基础知识,也...

    iOS开发避免安全隐患的要点总结

    在本篇文章里小编给各位整理了关于iOS开发如何避免安全隐患的知识点总结,需要的朋友们学习下。

    xmljava系统源码-NIiOS:iOS端常用知识点总结:Object-C

    这里把目前主要做的iOS端常用知识点总结下,便于后续开发拿来直接用; ii、后续会陆续贴出完整的复习笔记,有需要联系作者; (二十八) iOS Tencent/WCDB-增删改查 2021年01月06日10:16:51 2021年01月06日09:31:03 2021...

    移动应用开发技巧以及入门教程知识点总结.docx

    SDK集成:掌握各平台的软件开发工具包(SDK)集成方法,如Google Mobile Services、Apple iOS SDK等。 界面设计:遵循Material Design(Android)和Human Interface Guidelines(iOS)进行界面布局与交互设计。 ...

    千锋ios培训面试题总结

    千锋ios培训面试题总结 近三年面试题精华 重点知识点 常考知识点 培训的时候老师就保证这个面试题保证笔试百分之百的通过率 并且还有面试常问的问题 是千锋培训的面试宝典 请相信物有所值 只要看完了笔试秒杀

    iphone开发一年的工作笔记

    这份文档是我从事ios开发一年以来,总结工作中常用到的200余个ios小知识点,并添加可以调试观看的实例代码,方便iso开发者学习和交流,弄清楚这些,基本从事ios开发没什么问题。

    iOS-Course::laptop: PJ 的开发日常

    :sign_of_the_horns: 前言这是我在学习iOS开发相关内容过程中的总结,包括在日常coding、工作中、灵光一闪后的想法实践等都会在此进行分析总结。欢迎star、fork、PR。,当初开这个库时的一些想法。:Japanese_castle:...

    iOS 高级开发工程师面试进阶

    本课程以帮助学员面试 iOS 开发高级工程师为目标,从 runtime、runloop、消息转流程、UI 绘制原理、常考算法题和设计模式等角度,对面试中常被考的知识点做讲解和总结,希望大家更快拿到高薪 offer。

Global site tag (gtag.js) - Google Analytics