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

步子太大会扯到蛋

学习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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值