学习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
- 学习Objective-C之基础数据结构
- iphone开发基础之objective-c学习
- objective-c之基础
- 数据结构学习笔记之C指针基础
- IOS学习之二:Objective-C基础语法和关键字
- objective-c基础语法学习之--(2)NSString
- objective-c基础语法学习之--(3)NSArray
- objective-c 基础语法学习之--(4)NSDictionary
- objective-c基础语法学习之--(7)拷贝对象
- IOS学习之二:Objective-C基础语法和关键字
- 1.Objective-C基础学习
- Objective-C基础-初次学习
- Objective-c基础之NSNumber
- objective-c基础之block
- Objective-C基础之数组
- Objective-C基础之数组
- Objective-C基础之字符串
- Objective-C基础之字典
- Spring mvc4使用JSON包变更
- easyui的树型列表
- Python3.4+Nginx+Django1.8+Mysql5.5项目开发与部署
- 异常处理的执行顺序
- javaweb原理及其相关知识
- 学习Objective-C之基础数据结构
- 通信网络实验-嗅探器实现
- Class类
- SVN使用笔记
- 版本控制(8)--使用git演示案例
- python一些标准库
- 2015校招面试笔试题笔记
- 欧拉函数
- 第十一周项目四 类族的设计