学习Objective-C之基础数据结构

来源:互联网 发布:经纬度计算距离软件 编辑:程序博客网 时间:2024/06/06 19:50

步子太大会扯到蛋

学习C语言的时候,我们都是从基础学习,那么学习IOS也是从基础学习,这一片主要是一些常用数据类型的用法。
C语言的数据类型,再OC中都可以使用,那么OBjective-C中又增加了一些数据类型,方便开发者使用,增加开发效率,下面一一说下。
再说之前,先允许我介绍日志函数

  • NSLog
    Logs an error message to the Apple System Log facility.
NSLog的定义void NSLog ( NSString *format, ... );C语言printf的定义int printf(const char * restrict format, ...);
是不是很像呢,其实NSLog调用的NSLogv的,那么NSLogv又是怎么样定义的呢
void NSLogv ( NSString *format, va_list args );va_list 是不是很熟悉的呢,这是标准C里面的宏
官方让我们调用NSLog就行了,如果你要调用NSLogv的话,你自己组装va_list了
va_list ap;va_start(ap, fmt);va_end(ap);
就像上述这个样子,你是不是给自己找麻烦了,所以用NSLog就行了,在我们以后的工作之中你可能看到别人自定义的Log函数,这些都是对NSLog的宏定义是为了调试方便,比如说
#ifdef DEBUG#define DLog(fmt, ...) NSLog((@"%s [Line %d] " fmt), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__);#else#define DLog(...)#endif
调用DLog就可以看到行号,以及所在函数名
#ifdef DEBUG#define DLog(fmt, ...) NSLog((@"%s [Line %d] " fmt), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__);#else#define DLog(...)#endif#import <Foundation/Foundation.h>int main(int argc, const char * argv[]) {    @autoreleasepool {        // insert code here...        NSString *string = @"Hello word";        NSLog(@"NSLog-%@",string);        DLog(@"DLog-%@",string);    }    return 0;}
![运行结果](http://img.blog.csdn.net/20150517134311745)下面说一下formatNSLog中的格式话和printf有一点区别请仔细阅读这篇官方文档说的最清晰了[格式化](https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/Strings/Articles/formatSpecifiers.html) 那么需要特殊说明的是%@输出时的问题,官方文档给出的说明%@输出一个对象,比如说 NSString *string = @”Hello word”; NSLog(@”NSLog-%@”,string); 那么输出的对象为什么是字符串呢,是这样的每一个对象都有一个description的方法,而NSString的 description的方法默认实现是返回的字符串本身所以,我们以@%输出的时候,才会打印字符串。开发中遇见的一些坑有时候字符串中含有%@这种字符串如
#import <Foundation/Foundation.h>int main(int argc, const char * argv[]) {    @autoreleasepool {        // insert code here...        NSString *hello = @"Hello word";        NSLog(hello);        NSString *helloA = @"Hello word%@";        NSLog(helloA);    }    return 0;}
如果不注意的话,输出hello 字符串就对,输出helloA就错了呢可能回爆一个SIGBUS的异常,你先不用深究什么是SIGBUS,可暂时理解为溢出或反问越界,所以当有%@输出的时候,采用以下方式比较好。
  NSString *helloA = @"Hello word%@";  NSLog(@"%@", helloA);
下面说一下常用的数据类型
  • NSInter
#if __LP64__ || (TARGET_OS_EMBEDDED && !TARGET_OS_IPHONE) || TARGET_OS_WIN32 || NS_BUILD_32_LIKE_64typedef long NSInteger;typedef unsigned long NSUInteger;#elsetypedef int NSInteger;typedef unsigned int NSUInteger;#endif

分析一下
LP64 是64位架构
TARGET_OS_EMBEDDED是Mac OS 下的嵌入式系统
TARGET_OS_IPHONE 是Mac OS下的Iphone 系统
TARGET_OS_WIN32 是32位的Windows系统
NS_BUILD_32_LIKE_64是it changes NSInteger from long to
int and NSUInteger from unsigned long to unsigned int,这是我目前找到的最有价值的话。
有以上看来 ,影响我门最大的就是系统架构了。
也就是说64位上是long,32位上是int
因此输出一个NSInerger的时候,应该是这个样子的。

#import <Foundation/Foundation.h>int main(int argc, const char * argv[]) {    @autoreleasepool {        // insert code here...        NSInteger a = 100;#if __LP64__        NSLog(@"%ld", a);#else        NSLog(@"%d", a);#endif    }    return 0;}

如果你在64位编译的时候用%d输出的话,就会警告。XCode为了更好的兼用给出了一个%zi的符号,这个符号的作用就是64位的时候是%ld,32位的时候%d,以为上述代码,可以改成

#import <Foundation/Foundation.h>int main(int argc, const char * argv[]) {    @autoreleasepool {        // insert code here...        NSInteger a = 100;        NSLog(@"%zi", a);    }    return 0;}

所以NSInteger就是long 和double的一种,编程中常用到的还有
NSIntegerMax,NSIntegerMin,NSUIntegerMax,这些东西。定义如下

#define NSIntegerMax    LONG_MAX#define NSIntegerMin    LONG_MIN#define NSUIntegerMax   ULONG_MAX

-NSSring

0 0
原创粉丝点击