无论一个类设计的如何完美,都不可避免的会遇到没有预测到的需求,那怎么扩展现有的类呢?当然,继承是个不错的选择。但是Objective-C提供了一种特别的方式来扩展类,叫Catagory,可以动态的为已经存在的类添加新的行为。这样可以保证类的原原来的基础上,较小的改动就可以增加需要的功能。使用Category对类进行扩展时,不需要访问其源代码,也不需要创建子类,这样我们可以扩展系统提供的类。Category使用简单的方式,实现了类的相关方法的模块化,把不同的类方法分配到不同的分类文件中。
通过一个简单的例子看看Category如何使用。
现在我们有一个类叫MyClass
它有一个实例方法:myPrint,待会我们可以在扩展后调用它
好了,有了上面的MyClass后,我们要在不增加子类,不修改MyClass类的情况下增加一个HelloWorld的方法,怎么添加呢?只需添加两个文件MyClass+HelloWorld.h 和 MyClass+HelloWorld.m。
在声明文件和实现文件中用“()”把Category的名称括起来。原类名+Category”的这是约定的文件命名方式。
看看这两个文件怎么实现,在Xcoed上 按Command+N,新建文件,选择Objective-C category方式创建类,这样Xcode会自动帮你创建约定命名方式的文件。
Category on的类是MyClass,选对了哦
这样Xcode就帮你创建了MyClass+HelloWorld.h 和 MyClass+HelloWorld.m这两个 文件了。
那么我们现在添加一个HelloWorld方法。看看实现后的代码如下:
在main中调用
运行打印结果:
那的Category的使用场景有那些呢:
1、类包含了很多个方法实现,而这些方法需要不同团队的成员来实现
2、当你在使用基础类库中的类时,你不想继承这些类而只想添加一些方法时。
Category能实现上面的需求,当然也有使用Category是需要注意的问题:
1、Category可以访问原始类的实例变量,但不能添加实例变量,如果想添加变量,那就通过继承创建子类来实现。
2、Category可以重载原始类的方法,不大不推荐这么做,这样会覆盖掉原始类的方法。如果确实要重载,那就通过继承创建子类来实现。
3、和普通接口有所区别的是,在Category的实现文件中的实例方法只要你不去调用它你可以不用实现所有声明的所有方法。
著作权声明:本文由http://blog.csdn.net/totogo2010/原创
今年WWDC 2012苹果全球开发者大会上,苹果针对LLVM编译器都做了重大改进,新版的Xcode 4.4中的LLVM编译器升级到了4.0,给Objective-C带来了很多令人惊喜的特性。
注意,下面的语法需要下载Xcode 4.4。
1、枚举类型的改变老写法:
老方法的问题是枚举值的数据范围是模糊的,这个数值可能非常大,可能是负数,无法界定
新写法:
新方法在列出枚举内容的同时绑定了枚举数据类型NSUInteger,这样带来的好处是增强的类型检查和更好的代码可读性。
2、使用的方法代码放置的位置顺序无关
没在.h文件中声明的方法,在时候的时候如果方法不在前面,可能会有警告。
比如:
实现:
早期编译器编译时会出现:warning: instance method ‘-getString:’ not found…
新的编译器会先扫描代码中的方法,然后再编译,这样就避免了找不到方法这种情况了
3、property属性简化
@property对于使用Objective-C的程序员来说是相当熟悉的,property方便自动生成变量的getter 和setter。在.h文件中声明之后,还要在.m文件中加上@synthesize关键字,这样才能完成自动getter 和setter的过程。
比如说,我在.h文件中写了
@property (strong, nonatomic) NSDictionary *order;
我还要去对于的.m文件中写上
@synthesize order;
是不是感觉很多余啊?现在在语法新特性中不用写这行代码了,新版的编译器帮你实现这行代码,这叫帮人帮到底。
也是说,你在.h文件中声明order属性后,就可以直接在实现文件中使用该属性的getter和setter方法,编译器还会根据属性的可读和可写自动判断是否提供setter方法。智能多了。
4、语法的简化做过java 或C#开发的都知道,初始化或赋值一个变量一般用一个“=”号就搞定了,到了Objective-C后,每次都要用一个很长的函数才能赋值活初始化。现在简化多了。
咱们看看各个数据类型简化前后的对比。
4.1、NSNumber 类型老写法:
新写法:
4.2、NSArray类型
老写法:
新写法:
新的写法去掉了后面讨厌的nil。
4.3、NSDictionary类型
老写法
新写法
运行结果正常:
{
key1 = value1;
key2 = value2;
key3 = value3;
}
5、快速通过下标定位对象他们说新的语法这样是可以的,数组和字典都可以通过下标访问,
可是事实是这样的:
现实总是残忍的。于是google 了一下,发现这个语法是针对iOS 6 or OS X 10.8 SDKs的,我没有ios 6模拟器而已没有10.8 SDKs。所以报错了。可以参考这里:http://stackoverflow.com/questions/11425976/compiler-error-expected-method-not-found-when-using-subscript-on-nsarray
截图可以给你解释,新的语法特性编译器是怎么实现的。
著作权声明:本文由http://blog.csdn.net/totogo2010/原创
根据前文讨论的顺序,我们首先创建managedObjectModel(在那之前需要引入CoreData Framework):
在搭建完基础的Core Data栈结构后,就可以写一些简单的CURD代码了:
我们可以把读写的代码放到viewDidLoad函数中:
由于在context中创建的对象只是存在于内存中,所以我们还需要显式地把数据保存到sqlite文件里: