b2科目四模拟试题多少题驾考考爆了怎么补救
b2科目四模拟试题多少题 驾考考爆了怎么补救

华山论剑之iOS宏的定义和内联函数的使用

电脑杂谈  发布时间:2020-07-14 15:03:44  来源:网络整理

内联函数 宏_你正在试图运行的函数包含有宏_宏 内联函数 区别

宏定义是C提供的三个预处理功能之一. 这三个预处理包括: 宏定义内联函数,文件包含和条件编译.

格式: #define标识符字符串

说明:

(1)宏名称通常使用大写字母

(2)宏的使用可以提高程序的通用性和可读性,减少不一致性,减少输入错误并便于修改. 例如: 数组大小的通用宏定义

(3)预处理是在编译之前进行的处理,编译工作的任务之一是语法检查,而预处理不进行语法检查.

(4)宏定义的末尾没有分号;

(5)宏定义写在函数的花括号之.

(6)您可以使用#undef命令终止宏定义的范围

(7)可以嵌套宏定义

(8)字符串“”将永远不包含宏

你正在试图运行的函数包含有宏_内联函数 宏_宏 内联函数 区别

(9)宏定义不分配内存,变量定义分配内存.

除了常规的字符串替换外,还需要参数替换

格式: #define宏名称(参数表)字符串

例如: #define S(a,b)a * b

(1)如果实际参数是一个表达式,很容易出错

(2)宏名称和参数的括号之间不能有空格

(3)宏替换仅用于替换,无计算,无表达式解决方案

(4)在编译后程序运行并分配内存时进行函数调用. 宏替换是在编译之前完成的,没有分配内存

(5)宏的愚蠢组合没有类型,也没有类型转换.

(6)该函数只有一个返回值,您可以尝试使用宏获取多个值

(7)宏扩展使源程序更长内联函数 宏,并且函数调用不会

(8)宏扩展不占用运行时间,仅占用编译时间,而函数调用占用运行时间(分配内存,保留场景,值传递,返回值)

宏 内联函数 区别_你正在试图运行的函数包含有宏_内联函数 宏

如上所述,宏定义主要分为参数宏和非参数宏. 接下来,让我们看一下我们在iOS开发过程中常用的一些宏定义.


//主屏幕的宽高
#define KmainHight  [UIScreen mainScreen].bounds.size.height
#define KmainWidth  [UIScreen mainScreen].bounds.size.width
//导航栏高度
#define KnavigationBarHeight (44)
//标签栏高度
#define KtabBarHeight (49)

//普通颜色
#define KmyColor(R,G,B) [UIColor colorWithRed:R/255.0 green:G/255.0 blue:B/255.0 alpha:1.0]
// 随机颜色
#define KrandomColor   [UIColor colorWithRed:arrandom_uniform(256) / 255.0 green:arrandom_uniform(256) / 255.0 blue:arrandom_uniform(256) / 255.0 alpha:1]

//获取当前语言
#define KcurrentLanguage ([[NSLocale preferredLanguages] objectAtIndex:0])

//主要用于判断当前iOS版本号,对其弃用或者未出现的方法进行区别对待
#define KcurrentSystemVersion [[UIDevice currentDevice] systemVersion]  

//iPhone5
#define IPHONE5 ([UIScreen instancesRespondToSelector:@selector(currentMode)] ? CGSizeEqualToSize(CGSizeMake(640, 1136), [[UIScreen mainScreen] currentMode].size) : NO)
//iPhone6
#define IPHONE6 ([UIScreen instancesRespondToSelector:@selector(currentMode)] ? CGSizeEqualToSize(CGSizeMake(750, 1334), [[UIScreen mainScreen] currentMode].size) : NO)
//iPhone6 Plus
#define IPHONE6_Plus ([UIScreen instancesRespondToSelector:@selector(currentMode)] ? CGSizeEqualToSize(CGSizeMake(1242, 2208), [[UIScreen mainScreen] currentMode].size) : NO)
//Pad
#define KisPad (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)

/判断是真机还是模拟器  
#if TARGET_OS_IPHONE  
//真机
#endif  
  
#if TARGET_IPHONE_SIMULATOR  
//模拟器
#endif  

#define LocalString(string)     NSLocalizedString(string, nil)

//弱引用
#define KweakSelf(type)  __weak typeof(type) weak##type = type;
//强引用
#define KstrongSelf(type)  __strong typeof(type) type = weak##type;

//获取沙盒主路径
#define KhomePath    NSHomeDirectory()
//获取沙盒 Temp
#define KtempPath NSTemporaryDirectory()
//获取沙盒 Document
#define KdocumentPath    [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0]
//获取沙盒 Cache
#define KcachePath [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) firstObject]

//对象打印
#define KobjectLog(object)  NSLog(@"%@",(object));
//整型数字打印
#define KintNumberLog(number)  NSLog(@"%d",(number));
//float数字打印
#define KfloatNumberLog(number)  NSLog(@"%f",(number));


// 自定义NSLog,在debug模式下打印,在release模式下取消一切NSLog(上线时候使用推荐:⭐️⭐️⭐️⭐️⭐️)
#ifdef DEBUG
#define NSLog(FORMAT, ...) fprintf(stderr,"%s:%d\t%s\n",[[[NSString stringWithUTF8String:__FILE__] lastPathComponent] UTF8String], __LINE__, [[NSString stringWithFormat:FORMAT, ##__VA_ARGS__] UTF8String]);
#else
#define NSLog(FORMAT, ...) nil
#endif

你正在试图运行的函数包含有宏_宏 内联函数 区别_内联函数 宏

当我第一次接触内联函数时,我以为内向函数是宏定义. 后来,在杜娘的周期性教学之后,我意识到内联函数还有其他事情.

为什么要使用内联函数?实际上,主要原因是宏定义简单易懂,但容易出错. 让我们用例子来说明.

例如,下面的宏定义实际上非常简单,它是比较两个数字的大小.

#define Kmax(a, b)  (a) > (b) ? (a) : (b)

然后我们这样称呼

int result = Kmax(i, j) + 2 ; 

实际上,事实证明

 result = (i) > (j) ? (i) : (j) + 2 ; 

我们需要的是

 result = ( (i) > (j) ? (i) : (j) ) + 2 ; 

这与我们需要的期望相距一千英里. ...嗯,这时有人说,进行以下更改不会有问题吗?但是真的没有问题吗?<

#define Kmax(a, b)   ((a) > (b) ? (a) : (b))

内联函数 宏_你正在试图运行的函数包含有宏_宏 内联函数 区别

上面的修改确实可以解决上面的问题,但是我们如下使用它,仍然存在问题

 result = Kmax(i++, j); 

然后预处理将按以下方式进行,这仍然与我们的预期结果不一致...

 result = (i++) > (j) ? (i++) : (j); 

看到上面有很多问题,我相信你的头和我的一样大,这就是我们的猪脚--->内联函数可以解决问题,让我们看一下内联函数的结构.

采用上述比较方法,我们可以将其直接写入PCH文件中. 代码如下. (注意: NS_INLINE是内联函数的符号,要使用内联函数,需要导入Foundation框架. )这是上述问题的完美解决方案.

#import <Foundation/Foundation.h>
NS_INLINE int max( int a ,int b){
    
    return a>b?a:b;
    
}

以下是共享给所有人的内联函数的应用程序,这是一个自定义内联函数弹出窗口. (注意: 由于不推荐使用UIAlertView的问题,它会变成,但是它确实很容易使用,因此只需共享它即可).

#import <UIKit/UIKit.h>
#import <Foundation/Foundation.h>
NS_INLINE void tipWithMessage(NSString *message){
    
    dispatch_async(dispatch_get_main_queue(), ^{
        
        UIAlertView *alerView = [[UIAlertView alloc] initWithTitle:@"提示" message:message delegate:nil cancelButtonTitle:nil otherButtonTitles:nil, nil];
        
        [alerView show];
        
        [alerView performSelector:@selector(dismissWithClickedButtonIndex:animated:) withObject:@[@0, @1] afterDelay:0.9];
        
    });
    
}

下面的调用也非常简单,如下所示-在-(void)touchesBegan: (NSSet *)touches withEvent: (UIEvent *)event方法中,调用弹出函数.

-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
    tipWithMessage(@"世界,你好!");
}

以下是效果图.


本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-280125-1.html

    相关阅读
      发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

      热点图片
      拼命载入中...