Objective-C中方法签名(Method Signature)机制

引言

在ObjC语言中,我们会自定义各种各样的类,在类定义中,我们又会定义各种方法,当方法达到一定的数量,有时会不可避免的出现一些同名的方法。而同名的方法有时会导致运行时出现很奇怪的问题。比如传递参数不一致时,出现运行时错误。这些都和ObjC中的方法签名(Method Signature)相关。

阅读全文

UIAlertView弹出视图动画效果

在App设计中为了加强用户体验,我们会常常加入一些友好的动画效果。比如类似UIAlertView弹出的动画效果,由于系统中并没有直接提供类似的动画API,如果我们想要做出一样的效果,那就得深入的研究一下系统中的UIAlertView了。

仔细观察UIAlertView的动画你就会发现:这个动画是由几部分组成,它带一个视图大小抖动的效果。先是由小变大,再由大变小,最后变成本来的大小。但是这个大小的具体参数值和动画的速度恐怕是肉眼所不能看出来的。
本篇文章会使用一些objc runtime和CAAnimation的一些知识,通过本文你可以了解到如何研究一些objc中内部调用机制和动画基础。

阅读全文

iOS中的模糊效果

App设计时往往会用到一些模糊效果。iOS目前已提供一些模糊API可以让我们方便是使用。一种是使用Core Image,另一种是使用Accelerate.Framework中的vImage API。

使用Core Image进行模糊

Core Image很早在Mac系统中得到应用,后来这个Framework也开始应用到iOS,不过直到iOS6.0才开始支持模糊。这个API调用起来很方便简洁。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
- (UIImage *)blurryImage:(UIImage *)image
withBlurLevel:(CGFloat)blur {
CIImage *inputImage = [CIImage imageWithCGImage:image.CGImage];
CIFilter *filter = [CIFilter filterWithName:@"CIGaussianBlur"
keysAndValues:kCIInputImageKey, inputImage,
@"inputRadius", @(blur),
nil];
CIImage *outputImage = filter.outputImage;
CGImageRef outImage = [self.context createCGImage:outputImage
fromRect:[outputImage extent]];
return [UIImage imageWithCGImage:outImage];
}

阅读全文

Xcode字符串调试时显示问题

注意:这篇文章去年发表的,而新的Xcode5调整了字符串变量显示方式,之前显示格式是unichar\,现在为NSString*,所以在新版Xcode下已经没有问题了。谢谢网友们的关注。(2014-04-15)*

今天一位同事调试时发现了一个问题:一个字符串在被replace后,调试时并没有被replace。代码如下:

1
2
3
4
NSString *s = @"深圳市";
s = [s stringByReplacingOccurrencesOfString:@"市" withString:@""];
NSLog(@"%@",s);
return YES;

阅读全文

iOS崩溃日志分析

崩溃日志的产生

iOS中运行App过程中如果发生程序崩溃,会生成一个崩溃日志文件。这个文件会保存的特定系统目录下,扩展名是crash。你可以通过系统设置中的“通用-关于本机-诊断与用量-诊断与用量数据”来查看崩溃日志文件。

当手机连接到iTunes时,也会将该文件同步到电脑上。

  • 在Mac系统中这些文件会同步到“~/Library/Logs/CrashReporter/MobileDevice”下。

  • 在Windows系统中会同步到“C:UsersAppDataRoamingApple computerLogsCrashReporter/MobileDevice”(Vista或以上)或“C:Documents and SettingsApplication DataApple computerLogsCrashReporter”(XP)。

阅读全文

iOS6中的Passbook

在iOS6中新增了一个内置App:Passbook。Passbook可以保存很多卡片、兑换券之类的东西。每一个叫做一个Pass。其实一个Pass就是一个zip压缩包。这个zip包里包含pass相关的各种文件,如Pass配置文件,显示图标,显示背景等。

##Pass的种类

Pass目前有5种:Boarding pass、Coupon、Event ticket、Generic、Store card。每种种类都有各自的应用场景的展现布局。展现布局是固定的,但你可以自定义一些效果,如图标、背景和相关文本等。

阅读全文

在iOS中让图片旋转时抗锯齿

在iOS界面开发时,经常会将某一个视图进行旋转,旋转时会发现图片边缘出现了很多锯齿。即使把layer的edgeAntialiasingMask属性设置了依然会有锯齿。如何才能消除锯齿呢?如果你仔细,你会发现那些边缘虚化(透明)的图片在旋转时并不会出现锯齿。那么如果我们把这些图片的边缘透明化,会不会解决这个问题呢?
我取了一个图片,不进行任何处理,然后让它旋转0.1弧度:

image

阅读全文

让项目在编译时自动加上occheck

之前我开源了一个项目occheck,它是一个检查内存泄漏和高危函数的自动化工具。但是如何利用好它呢?如果能够像Xcode静态分析那样能自动在编译时执行就好了。呵呵,言归正传,这篇文章将为你详细介绍如何在项目调试前进行自动检查,以达到减少不安全的代码目的。我们开始吧!

1、创建一个Runscript(运行脚本)

打开项目配置,选择合适的target,在右侧选择“Build Phases”。然后在下方点击“Add Build Phases”-“Add Run Script”。如下图:

阅读全文

iOS将大文件映射到内存

在《中国区GPS偏移纠正(适用于Google地图)》一文中曾读取一个78M的大数据文件,一开始采用了NSData的dataWithContentsOfFile:方法。不少人反馈说如果直接使用,将会耗尽iOS的内存。其实这个是可以改善的。
NSData还有一个API:

1
+ (id)dataWithContentsOfFile:(NSString *)path options:(NSDataReadingOptions)readOptionsMask error:(NSError **)errorPtr;

其中NSDataReadingOptions可以附加一个参数NSDataReadingMappedIfSafe参数。使用这个参数后,iOS就不会把整个文件全部读取的内存了,而是将文件映射到进程的地址空间中,这么做并不会占用实际内存。这样就可以解决内存满的问题。

阅读全文

一个模拟网页表单请求封装类(支持文件上传)

自己在作项目时经常会遇到要上传文件同时还要附带一些字符串参数的网络请求,由于文件有时是二进制数据,采用http查询参数就不太适合了。最好的方式是采取Web表单的方式上传文件,自己写了这么一个类,就分享一下。
代码地址:https://github.com/shenqiliang/HTTPForm-iOS

阅读全文