当前位置:  编程技术>移动开发
本页文章导读:
    ▪Objective-C语法之Category的应用        Objective-C语法之Category的使用 无论一个类设计的如何完美,都不可避免的会遇到没有预测到的需求,那怎么扩展现有的类呢?当然,继承是个不错的选择。但是Objective-C提供了一种特别的方式.........
    ▪ Xcode 4.4中LLVM compiler 4.0带到的Objective-C新语法特性        Xcode 4.4中LLVM compiler 4.0带来的Objective-C新语法特性 今年WWDC 2012苹果全球开发者大会上,苹果针对LLVM编译器都做了重大改进,新版的Xcode 4.4中的LLVM编译器升级到了4.0,给Objective-C带来了很多令.........
    ▪ Core Data浅谈系列之二 : 简略的CURD       Core Data浅谈系列之二 : 简单的CURD 在上一篇中简单介绍了Core Data Stack,自上而下地对Core Data应用结构有个基本的认识,不过都是理论上的。这里就以上一篇的理论构建起一个可运行的Demo,.........

[1]Objective-C语法之Category的应用
    来源: 互联网  发布时间: 2014-02-18
Objective-C语法之Category的使用

无论一个类设计的如何完美,都不可避免的会遇到没有预测到的需求,那怎么扩展现有的类呢?当然,继承是个不错的选择。但是Objective-C提供了一种特别的方式来扩展类,叫Catagory,可以动态的为已经存在的类添加新的行为。这样可以保证类的原原来的基础上,较小的改动就可以增加需要的功能。使用Category对类进行扩展时,不需要访问其源代码,也不需要创建子类,这样我们可以扩展系统提供的类。Category使用简单的方式,实现了类的相关方法的模块化,把不同的类方法分配到不同的分类文件中。

通过一个简单的例子看看Category如何使用。

现在我们有一个类叫MyClass

 

[cpp] view plaincopy
  • #import <Foundation/Foundation.h>  
  •   
  • @interface MyClass : NSObject  
  • -(void) myPrint;  
  • @end  
  •  

     

    [cpp] view plaincopy
  • #import "MyClass.h"  
  •   
  • @implementation MyClass  
  • -(void) myPrint{  
  •     NSLog(@"myPrint 调用了");  
  • }  
  • @end  
  • 它有一个实例方法: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方法。看看实现后的代码如下:

     

    [cpp] view plaincopy
  • #import "MyClass.h"  
  •   
  • @interface MyClass (HelloWorld)  
  • -(void)HelloWorld;  
  • @end  
  • [cpp] view plaincopy
  • #import "MyClass+HelloWorld.h"  
  •   
  • @implementation MyClass (HelloWorld)  
  • -(void)HelloWorld{  
  •     NSLog(@"你好 伦敦奥运!");  
  • }  
  • @end  
  • 在main中调用

     

     

    [cpp] view plaincopy
  • MyClass *myclass = [[[MyClass alloc]init]autorelease];  
  • [myclass HelloWorld];  
  • [myclass myPrint];  
  •  

    运行打印结果:

     

    [cpp] view plaincopy
  • 2012-08-09 11:24:16.697 objectiveC[16053:403] 你好 伦敦奥运!  
  • 2012-08-09 11:24:16.699 objectiveC[16053:403] myPrint 调用了  
  •  

     

    那的Category的使用场景有那些呢:
    1、类包含了很多个方法实现,而这些方法需要不同团队的成员来实现
    2、当你在使用基础类库中的类时,你不想继承这些类而只想添加一些方法时。
     
    Category能实现上面的需求,当然也有使用Category是需要注意的问题:
    1、Category可以访问原始类的实例变量,但不能添加实例变量,如果想添加变量,那就通过继承创建子类来实现。
    2、Category可以重载原始类的方法,不大不推荐这么做,这样会覆盖掉原始类的方法。如果确实要重载,那就通过继承创建子类来实现。
    3、和普通接口有所区别的是,在Category的实现文件中的实例方法只要你不去调用它你可以不用实现所有声明的所有方法。

     

    著作权声明:本文由http://blog.csdn.net/totogo2010/原创


        
    [2] Xcode 4.4中LLVM compiler 4.0带到的Objective-C新语法特性
        来源: 互联网  发布时间: 2014-02-18
    Xcode 4.4中LLVM compiler 4.0带来的Objective-C新语法特性

    今年WWDC 2012苹果全球开发者大会上,苹果针对LLVM编译器都做了重大改进,新版的Xcode 4.4中的LLVM编译器升级到了4.0,给Objective-C带来了很多令人惊喜的特性。

    注意,下面的语法需要下载Xcode 4.4。

    1、枚举类型的改变

    老写法:

     

    [cpp] view plaincopy
  • typedef enum Week{  
  •     Moday,  
  •     Tuesday,  
  •     Wednesday,  
  •     Thursday,  
  •     Friday,  
  •     Saturday,  
  •     Sunday      
  • }Week;  
  • 老方法的问题是枚举值的数据范围是模糊的,这个数值可能非常大,可能是负数,无法界定

     


    新写法:

     

    [cpp] view plaincopy
  • typedef enum Week:NSUInteger{  
  •     Moday,  
  •     Tuesday,  
  •     Wednesday,  
  •     Thursday,  
  •     Friday,  
  •     Saturday,  
  •     Sunday      
  • }Week;  
  • 新方法在列出枚举内容的同时绑定了枚举数据类型NSUInteger,这样带来的好处是增强的类型检查和更好的代码可读性。

     

    2、使用的方法代码放置的位置顺序无关

    没在.h文件中声明的方法,在时候的时候如果方法不在前面,可能会有警告。

    比如:

     

    [cpp] view plaincopy
  • @interface MyClass : NSObject  
  • -(void)doSomething:(NSString *) print;  
  • @end  

  • 实现:

    [cpp] view plaincopy
  • @implementation MyClass  
  • -(void)doSomething:(NSString *)print{  
  •     NSLog(@"%@", [print stringByAppendingFormat:[self getString]]);  
  • }  
  • -(NSString *)getString{  
  •     return@"string for something";  
  • }  
  • @end  

  • 早期编译器编译时会出现: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 类型

    老写法:

     

    [cpp] view plaincopy
  • NSNumber *number;  
  • number = [NSNumber numberWithChar:'X'];  
  • number = [NSNumber numberWithInt:12345];  
  • number = [NSNumber numberWithUnsignedLong:12345ul];  
  • number = [NSNumber numberWithLongLong:12345ll];  
  • number = [NSNumber numberWithFloat:123.45f];  
  • number = [NSNumber numberWithDouble:123.45];  
  • number = [NSNumber numberWithBool:YES];  
  •  

    新写法:

     

    [cpp] view plaincopy
  • NSNumber *number;  
  • number = @'X';  
  • number = @12345;  
  • number = @12345ul;  
  • number = @12345ll;  
  • number = @123.45f;  
  • number = @123.45;  
  • number = @YES;  
  •  

    4.2、NSArray类型

    老写法:

     

    [cpp] view plaincopy
  • NSArray *array;  
  • array = [NSArray arrayWithObjects:@"object1", @"object2", @"object3", nil];  

  • 新写法:

     

     

    [cpp] view plaincopy
  • NSArray *array = @[ @"object1", @"object2", @"object3" ];  

  • 新的写法去掉了后面讨厌的nil。

     

    4.3、NSDictionary类型

    老写法

    [cpp] view plaincopy
  • NSDictionary *dict = [NSDictionary dictionaryWithObjects:@[@"value1", @"value2", @"value3"]  
  •                                    forKeys:@[@"key1", @"key2", @"key3"]];  
  • 新写法

     

     

    [cpp] view plaincopy
  • NSDictionary *dict = @{@"key1": @"value1",@"key2": @"value2",@"key3": @"value3" };  
  • NSLog(@"%@", dict);  
  •  

    运行结果正常:

    {

        key1 = value1;

        key2 = value2;

        key3 = value3;

    }

    5、快速通过下标定位对象

    他们说新的语法这样是可以的,数组和字典都可以通过下标访问,

     

    [cpp] view plaincopy
  • NSArray *array =@[ @"object1", @"object2", @"object3" ];  
  •   
  • id obj = array[0]; //通过下标方式获取数组对象,替换原有写法:array objectAtIndex:i];  
  • NSString *obj1  = @"oooo";  
  • array[0]  = obj1; //也可以直接为数组对象赋值。替换原有写法:[array replaceObjectAtIndex:i withObject:newObj];  
  •   
  • NSDictionary *dict = @{@"key1": @"value1",@"key2": @"value2",@"key3": @"value3" };  
  • id obj2 = dict[@"key1"];//获取o2对象,替换原有写法:[dic objectForKey:k2];  
  • dict[@"key2"] = obj;  //重新为键为k2的对象赋值,替换原有写法:[dic setObject:newObj forKey:k2]  
  • 可是事实是这样的:

     


    现实总是残忍的。于是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

    下面是WWDC 2012视频的一些关于新语法特性的截图:

    截图可以给你解释,新的语法特性编译器是怎么实现的。

    著作权声明:本文由http://blog.csdn.net/totogo2010/原创


        
    [3] Core Data浅谈系列之二 : 简略的CURD
        来源: 互联网  发布时间: 2014-02-18
    Core Data浅谈系列之二 : 简单的CURD
    在上一篇中简单介绍了Core Data Stack,自上而下地对Core Data应用结构有个基本的认识,不过都是理论上的。这里就以上一篇的理论构建起一个可运行的Demo,执行一些简单的增删改查操作。
     
    (图片来自Apple)
     
     
    首先,我们需要建立如上图的栈结构。因此,在ViewController里添加3个属性:
    [cpp] view plaincopy
  • @interface ViewController : UIViewController  
  •   
  • @property (nonatomic, retain) NSManagedObjectModel *managedObjectModel;  
  • @property (nonatomic, retain) NSManagedObjectContext *managedObjectContext;  
  • @property (nonatomic, retain) NSPersistentStoreCoordinator *persistentStoreCoordinator;  
  •   
  • @end  
  • 根据前文讨论的顺序,我们首先创建managedObjectModel(在那之前需要引入CoreData Framework):

    [cpp] view plaincopy
  • - (NSManagedObjectModel *)managedObjectModel  
  • {  
  •     if (nil != _managedObjectModel) {  
  •         return _managedObjectModel;  
  •     }  
  •       
  •     _managedObjectModel = [[NSManagedObjectModel mergedModelFromBundles:nil] retain];  
  •     return _managedObjectModel;  
  • }  
  • 接着创建NSManagedObject的生存环境 —— NSManagedObjectContext:
    [cpp] view plaincopy
  • - (NSManagedObjectContext *)managedObjectContext  
  • {  
  •     if (nil != _managedObjectContext) {  
  •         return _managedObjectContext;  
  •     }  
  •       
  •     _managedObjectContext = [[NSManagedObjectContext alloc] init];  
  •     return _managedObjectContext;  
  • }  
  • 由于Demo会将数据存储到本地文件,所以还需要NSPersistentStoreCoordinator和NSManagedObjectContext配合。
    下面是创建Core Data栈结构的完整代码:
    [cpp] view plaincopy
  • #pragma mark -   
  • #pragma mark - Core Data Stack  
  •   
  • - (NSManagedObjectModel *)managedObjectModel  
  • {  
  •     if (nil != _managedObjectModel) {  
  •         return _managedObjectModel;  
  •     }  
  •       
  •     _managedObjectModel = [[NSManagedObjectModel mergedModelFromBundles:nil] retain];  
  •     return _managedObjectModel;  
  • }  
  •   
  • - (NSManagedObjectContext *)managedObjectContext  
  • {  
  •     if (nil != _managedObjectContext) {  
  •         return _managedObjectContext;  
  •     }  
  •       
  •     _managedObjectContext = [[NSManagedObjectContext alloc] init];  
  •       
  •     if (self.persistentStoreCoordinator) {  
  •         [_managedObjectContext setPersistentStoreCoordinator:self.persistentStoreCoordinator];  
  •     }  
  •       
  •     return _managedObjectContext;  
  • }  
  •   
  • - (NSPersistentStoreCoordinator *)persistentStoreCoordinator  
  • {  
  •     if (nil != _persistentStoreCoordinator) {  
  •         return _persistentStoreCoordinator;  
  •     }  
  •       
  •     NSString *storeType = NSSQLiteStoreType;  
  •     NSString *storeName = @"cdNBA.sqlite";  
  •       
  •     NSError *error = NULL;  
  •     NSURL *storeURL = [NSURL fileURLWithPath:[[self applicationDocumentsDirectory] stringByAppendingPathComponent:storeName]];  
  •       
  •     _persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:self.managedObjectModel];  
  •     if (![_persistentStoreCoordinator addPersistentStoreWithType:storeType configuration:nilURL:storeURL options:nil error:&error]) {  
  •         NSLog(@"Error : %@\n", [error localizedDescription]);  
  •         NSAssert1(YES, @"Failed to create store %@ with NSSQLiteStoreType", [storeURL path]);  
  •     }  
  •       
  •     return _persistentStoreCoordinator;  
  • }  
  •   
  • #pragma mark -  
  • #pragma mark Application's Documents Directory  
  •   
  • - (NSString *)applicationDocumentsDirectory  
  • {  
  •     NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);  
  •     NSString *basePath = ([paths count] > 0) ? [paths objectAtIndex:0] : nil;  
  •     return basePath;  
  • }  
  • 在搭建完基础的Core Data栈结构后,就可以写一些简单的CURD代码了:

    [cpp] view plaincopy
  • #pragma mark -   
  • #pragma mark - CURD Operations  
  •   
  • - (BOOL)createTeamWithName:(NSString *)teamName city:(NSString *)teamCity  
  • {  
  •     if (!teamName || !teamCity) {  
  •         return NO;  
  •     }  
  •       
  •     NSManagedObject *teamObject = [NSEntityDescription insertNewObjectForEntityForName:@"Team" inManagedObjectContext:self.managedObjectContext];  
  •     [teamObject setValue:teamName forKey:@"name"];  
  •     [teamObject setValue:teamCity forKey:@"city"];  
  •       
  •     return YES;  
  • }  
  •   
  • - (NSArray *)fetchTeamList  
  • {  
  •     NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];  
  •     [fetchRequest setEntity:[NSEntityDescription entityForName:@"Team" inManagedObjectContext:self.managedObjectContext]];  
  •       
  •     NSError *error = NULL;  
  •     NSArray *array = [self.managedObjectContext executeFetchRequest:fetchRequest error:&error];  
  •     if (error) {  
  •         NSLog(@"Error : %@\n", [error localizedDescription]);  
  •     }  
  •       
  •     [fetchRequest release], fetchRequest = nil;  
  •       
  •     return array;  
  • }  
  • 我们可以把读写的代码放到viewDidLoad函数中:

    [cpp] view plaincopy
  • - (void)viewDidLoad  
  • {  
  •     [superviewDidLoad];  
  • // Do any additional setup after loading the view, typically from a nib.  
  •       
  •     [self createTeamWithName:@"Heat"city:@"Miami"];  
  •     [self createTeamWithName:@"Lakers"city:@"LA"];  
  •     [self saveContext];  
  •       
  •     NSArray *teamArray = [self fetchTeamList];  
  •     if (teamArray) {  
  •         for (NSManagedObject *teamObject in teamArray) {  
  •             NSString *teamName = [teamObject valueForKey:@"name"];  
  •             NSString *teamCity = [teamObject valueForKey:@"city"];  
  •             NSLog(@"Team info : %@, %@\n", teamName, teamCity);  
  •         }  
  •     }  
  • }  
  • 由于在context中创建的对象只是存在于内存中,所以我们还需要显式地把数据保存到sqlite文件里:

    [cpp] view plaincopy
  • #pragma mark -  
  • #pragma mark - Save Context  
  •   
  • - (void)saveContext  
  • {  
  •     NSError *error = NULL;  
  •     NSManagedObjectContext *moc = self.managedObjectContext;  
  •     if (moc && [moc hasChanges] && ![moc save:&error]) {  
  •         NSLog(@"Error %@, %@", error, [error localizedDescription]);  
  •         abort();  
  •     }  
  • }  
  • 最后,就是跑一下Demo,检验一下结果。
    执行过一次程序后,我们可以搜索下cdNBA.sqlite文件,然后查看里面的数据: 
     

     
    同时,控制台也输出了数据:
    [plain] view plaincopy
  • 2013-01-16 14:32:52.638 cdNBA[4717:c07] Team info : Heat, Miami  
  • 2013-01-16 14:32:52.639 cdNBA[4717:c07] Team info : Lakers, LA  

  •     
    最新技术文章:
    ▪Android开发之登录验证实例教程
    ▪Android开发之注册登录方法示例
    ▪Android获取手机SIM卡运营商信息的方法
    ▪Android实现将已发送的短信写入短信数据库的...
    ▪Android发送短信功能代码
    ▪Android根据电话号码获得联系人头像实例代码
    ▪Android中GPS定位的用法实例
    ▪Android实现退出时关闭所有Activity的方法
    ▪Android实现文件的分割和组装
    ▪Android录音应用实例教程
    ▪Android双击返回键退出程序的实现方法
    ▪Android实现侦听电池状态显示、电量及充电动...
    ▪Android获取当前已连接的wifi信号强度的方法
    ▪Android实现动态显示或隐藏密码输入框的内容
    ▪根据USER-AGENT判断手机类型并跳转到相应的app...
    ▪Android Touch事件分发过程详解
    ▪Android中实现为TextView添加多个可点击的文本
    ▪Android程序设计之AIDL实例详解
    ▪Android显式启动与隐式启动Activity的区别介绍
    ▪Android按钮单击事件的四种常用写法总结
    ▪Android消息处理机制Looper和Handler详解
    ▪Android实现Back功能代码片段总结
    ▪Android实用的代码片段 常用代码总结
    ▪Android实现弹出键盘的方法
    ▪Android中通过view方式获取当前Activity的屏幕截...
    ▪Android提高之自定义Menu(TabMenu)实现方法
    ▪Android提高之多方向抽屉实现方法
    ▪Android提高之MediaPlayer播放网络音频的实现方法...
    ▪Android提高之MediaPlayer播放网络视频的实现方法...
    ▪Android提高之手游转电视游戏的模拟操控
     


    站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3