步子太大会扯到蛋
学习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;
}
![运行结果](https://img-blog.csdn.net/20150517134311745) 下面说一下format NSLog中的格式话和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_64
typedef long NSInteger;
typedef unsigned long NSUInteger;
#else
typedef 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