<iOS开发进阶> 干货汇总

之前看完了<iOS开发进阶>, 也做了相应的总结, 详见:读<iOS开发进阶>有感

今天花点时间, 把一些干货汇总下, 然后就可以和这本书say goodbye了。

包括:

  1. p85 10.1.3
  2. p96 使用GCD后
  3. p99 后台运行
  4. p131 使用Safari进行调试
  5. p184 收起键盘
  6. p185 设置应用内的系统控制语言
  7. p193 忽略编译警告
  8. p198 给模拟器相册增加图片

10.1.3 不要向已经释放的对象发送消息

有些读者想测试当对象释放时, 其retainCount 是否变为了0, 他们的试验代码如下: (记得要在Appdelegate.m 中 设置为MRC -fno-objc-arc)

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    // Override point for customization after application launch.

    NSObject *object = [[NSObject alloc] init];
    NSLog(@"Reference Count = %u", [object retainCount]);

    [object release];
    NSLog(@"Reference Count = %u", [object retainCount]);
    return YES;
}
// 打印结果
// 2015-01-21 10:04:05.799 MRC_Test[2985:607] Reference Count = 1
// 2015-01-21 10:04:05.800 MRC_Test[2985:607] Reference Count = 1

我们注意到, 最后一次输出, 引用计数没有变成0。因为该对象的内存已经被回收,而我们向一个已经被回收的对象发一个retainCount消息,所以它的输出结果应该是不确定的,如果该对象所占的内存被复用了,那么就有可能造成程序异常崩溃。

那为什么这个对象被回收之后,这个不确定的值是1而不是0呢。这是因为当最后一次执行release时,系统知道马上就要回收内存了。就没有必要再将retainCount减1了,因为不管减不减1,该对象都肯定会被回收。而对象被回收后,它的所有内存区域,包括retainCount值也变得没有意义。不将这个值从1变为0,可以减少一次内存的操作,加速对象的回收。

使用GCD后

11.2.4 后台运行

使用block的另一个用处是可以让程序在后台较长久地运行。

在以前, 当应用被按Home键退出后,应用仅有最多5秒钟的时间做一些保存或清理资源的工作。但是应用可以调用UIApplication 的 beginBackgroundTaskWithExpirationHandler方法,让应用最多有10分钟的时间在后台长久运行。这个时间可以用来做清理本地缓存,发送统计数据等工作。

// Appdelegate.h

@property (assign, nonatomic) UIBackgroundTaskIdentifier backgroundUpdateTask;

// Appdelegate.m

launchOptions
{
    // Override point for customization after application launch.
    return YES;
}

- (void)applicationWillResignActive:(UIApplication *)application
{
    // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.
    // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game.
}

- (void)applicationDidEnterBackground:(UIApplication *)application
{

    [self beginBackgroundUpdateTask];

    //在这里添加需要长久运行的代码

    [self endBackgroundUpdateTask];
}

- (void)beginBackgroundUpdateTask
{
    self.backgroundUpdateTask = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{
        [self endBackgroundUpdateTask];
    }];
}

- (void)endBackgroundUpdateTask
{
    [[UIApplication sharedApplication] endBackgroundTask:self.backgroundUpdateTask];
    self.backgroundUpdateTask = UIBackgroundTaskInvalid;
}

15.7  使用Safari进行调试

18.2.2  收起键盘

在UIViewController中收起键盘, 除了调用相应控件的resignFirstResponder 方法外, 还有另外三种办法:

1. 重载 UIViewController 中的 touchesBegin方法, 然后在里面执行 [self.view endEdiiting: YES]; 这样单击UIViewController的任意地方, 就可以收起键盘。

2. 直接执行[[UIApplication sharedApplication] sendAction:@selector(resignFirstResponder) to: nil from: nil forEvent: nil]; 用于在获得当前UIViewController比较困难的时候用。

3. 直接执行 [[[UIApplication sharedApplication] keyWindow] endEditing: YES]

18.2.4  设置应用内的系统控制语言

在iOS应用中, 有时候会需要调用系统的一些UI控件, 例如:

1. 在UIWebView中长按弹出系统的上下文菜单。

2. 在UIImagePickerController中会使用系统的照相机界面。

3. 在编译状态下的UITableViewCell, 处于待删除状态时, 会有一个系统的删除按钮。

以上这些UI控件, 其显示的语言并不是和你当前手机的系统语言一致, 而是根据你的应用内部的语言设置来显示。

在 info.plist文件中, 增加:

CFBundleLocalizations     zh_CN

18.2.9  忽略编译警告

使用-w禁止掉所有的编译警告, 用-Wno-unused-variable 只禁止未使用变量的编译警告。

(用法和 -fno-objc-arc 一样)

18.4.3  给模拟器相册增加图片

... 直接把图片拖放到模拟器中, 会利用Safari打开, 然后保存即可。

时间: 2024-11-05 14:47:41

<iOS开发进阶> 干货汇总的相关文章

iOS开发之手势识别汇总

iOS开发之手势识别汇总 iOS开发中手势识别有六种: 轻击手势(TapGestureRecognizer), 轻扫手势 (SwipeGestureRecognizer), 长按手势(LongPressGestureRecognizer), 拖动手势(PanGestureRecognizer), 捏合手势(PinchGestureRecognizer), 旋转手势(RotationGestureRecognizer), 1,轻击手势(TapGestureRecognizer) UITapGest

读&lt;iOS开发进阶&gt;有感

花了两天时间, 零零散散看完了这本书.总的来说, 比较失望吧. 花点时间记录下. 第一次看到这本书, 是在看唐巧大神博客的时候看到的  ---------->  <iOS开发进阶>即将出版 那时候, 就被吸引住了.原因不外乎如下三点: 作者: 唐巧大神写的书, 怎么能错过 内容: 开发进阶, 学习了iOS有一段时间, 确实比较期待这类的书籍 封面: 简约大气, 很喜欢. 然后就一直等出版, 本来说12月底就能出版, 然后一直拖, 当当要到1月20号左右才正式出售, 现在都是预售阶段..

iOS开发进阶

博客专栏>移动开发专栏>IOS开发进阶 分享到:新浪微博腾讯微博IOS开发进阶 iPhone开发进阶,如果你已经基本熟悉了Objective-c基本语法,你已经熟悉iOS程序开发的基础,那么我们再进一步的学习iOS开发的知识.比如多任务编程,网络,系统方面的原理,内存管理,debug或查找crash的技巧等. 收藏 订阅 最新更新文章 [移动开发] iOS界面-仿网易新闻左侧抽屉式交互 续(添加新闻内容页和评论页手势) 1.介绍有的博友看了上篇博文 iOS界面-仿网易新闻左侧抽屉式交互 ,在微

《iOS开发进阶》书籍目录

第一部分:iOS开发工具 第二部分:iOS开发实践 第10章 理解内存管理 10.1 引用计数 10.1.1 什么是引用计数,原理是什么 10.1.2 我们为什么需要引用计数 10.1.3 不要向已经释放的对象发送消息 10.1.4 循环引用(reference cycles)问题 10.1.5 使用Xcode检测循环引用 10.2 使用ARC 10.2.1 Automatic Reference Count 10.2.2 Core Foundation对象的内存管理 第11章 掌握GCD 11

iOS开发进阶(iOS开发实战:GCD)summary

多线程:我们一般把耗时操作放到子线程来执行,然后主线程只做UI操作 GCD是苹果开发的一个多核编程的解决办法,和(NSThread.NSOperationQueue.NSInvocationOperation)多线程技术方案相比,使用起来更加简单和方便 //网络显示图片   self.indicator.hidden = NO;   [self.indicator startAnimating];   //进入异步线程   dispatch_async(dispatch_get_global_q

iOS开发学习网站汇总

*本文转自CocoaChina 原文:11 Insanely Great iOS Developers Sites永不止步地向他人学习 我相信,要想从一个"还不错"的人变成一个卓越的人,我们需要不停地向他人学习,同时还得尽早地适应最新的技术和工具.除了苹果官方文档网站之外,我列举了一些能获取有价值的文章和资源的网站,这些网站能够帮助我们更上一个台阶. 让我们先看一些原创内容博客: objc.io 这个网站由世界级的iOS工程师每月进行更新.上面可以看到关于某些话题的高质量文章和深度评论

iOS开发实用干货——强化你的Xcode控制台

f(x) 郑秀晶程序员不要整天看代码,偶尔也要看看风景?? www.90168.org先上一张我的Xcode控制台的图片让你们感受一下 酷炫控制台 是不是觉得很酷?不过仅仅是酷还是远远不够的,当你点击蓝色链接的时候会瞬间定位到nslog代码那里.不得不说,很强势. 你以为这就够了?请看下图: 没什么不同啊?? 觉得和你的控制台没什么不同?那你让字典显示中文试试. 方法追踪,并且方法栈支持link操作 方法栈打印 也就是说,你可以往前追溯方法调用链了 我知道,你们都是来求插件的?? 这个插件是一个

iOS开发进阶 - 使用shell脚本自动打包上传到fir.im上-b

用fir.im测试已经好长时间了,感觉每次打包上传都很麻烦,想着是不是可以用脚本自动打包,在网上搜了一下确实有,下面总结一下如何使用脚本自动打包上传到fir.im,以及打包过程中遇到的问题和解决办法 相关资料和下载 首先是打包脚本的下载地址,这个是我找到的比较全的一个,里面有很多不同功能的shell脚本,亲测好用,传送门:https://github.com/heyuan110/BashShell?spm=5176.100239.blogcont5028.4.kFcLtR 还有关于fir指令的一

《iOS开发进阶》

1. http://alcatraz.io/ 安装curl -fsSL https://raw.github.com/supermarin/Alcatraz/master/Scripts/install.sh | sh Uninstall Delete the plugin: rm -rf ~/Library/Application\ Support/Developer/Shared/Xcode/Plug-ins/Alcatraz.xcplugin Remove all cached data: