IOS之学习笔记二(块)

举报
chenyu 发表于 2021/07/26 23:17:46 2021/07/26
【摘要】 1、逗号表达式,返回整个逗号表达式的返回值是最后一个表达式的返回值,长见识了,第一次听说,比如 int x = (a = 3, a = 4, a = 5, a = 6); NSLog(@"x is %d", x);x is 6   2、iOS 有如下三种随机数方法:     1)、srand((unsigned)time...

1、逗号表达式,返回整个逗号表达式的返回值是最后一个表达式的返回值,长见识了,第一次听说,比如


  
  1. int x = (a = 3, a = 4, a = 5, a = 6);
  2. NSLog(@"x is %d", x);x is 6

 


2、iOS 有如下三种随机数方法:

 

 


  
  1. 1)、srand((unsigned)time(0)); //不加这句每次产生的随机数不变
  2. int i = rand() % 5;
  3. 2)、srandom(time(0));
  4. int i = random() % 5;
  5. 3)、int i = arc4random() % 5 ;



注:rand()和random()实际并不是一个真正的伪随机数发生器,在使用之前需要先初始化随机种子,否则每次生成的随机数一样。
arc4random() 是一个真正的伪随机算法,不需要生成随机种子,因为第一次调用的时候就会自动生成。而且范围是rand()的两倍。在iPhone中,RAND_MAX是0x7fffffff (2147483647),而arc4random()返回的最大值则是 0x100000000 (4294967296)。
精确度比较:arc4random() > random() > rand()。

 

 

 

 

3、块的基本用法,定义如下
   ^[块返回值类型](形参类型1 形参1 形参类型2 形参2)
   {
    //块执行体
   }
 
   1)、定义块必须以^开头
   2)、定义块返回值类型一般省略
   3)、定义块不需要值名字
   4)、块的参数可以是(void)

   块变量格式
   块返回值类型(^块变量名)(形参类型1, 形参类型2);

 
   一般使用


  
  1. #import <Foundation/Foundation.h>
  2. int main(int argc, char * argv[]) {
  3. @autoreleasepool {
  4. void (^printStr)(void) = ^(void) {
  5. NSLog(@"我在学习oc的块");
  6. };
  7. printStr();
  8. int (^sum)(int, int) = ^(int a, int b) {
  9. return a + b;
  10. };
  11. NSLog(@"sum is %d", sum(a, b));
  12. void (^print)(NSString) = ^(NSString *info) {
  13. NSLog(@"info value is %@", info);
  14. };
  15. print(@"chenyu");
  16. }
  17. }

 


   块可以访问局部变量的值,但是不许修改,因为传递进去的是值,不是地址,所以不能修改,following
   下面代码会引起错误
 

 


  
  1. int value = 20;
  2. void (^print)(void) = ^(void) {
  3. value = 30;
  4. NSLog(@"%d", value);
  5. }
  6. value = 45;
  7. print();

 


   看下面的例子
 

 


  
  1. int value = 20;
  2. void (^print)(void) = ^(void) {
  3. NSLog(@"%d", value);
  4. }
  5. value = 45;
  6. print();

 


   结果打印是20,我们不是修改了成了45吗?当程序用块访问局部变量时,系统在定义块会把局部变量的值保存在块中,而不是等到执行时才去访问获取变量的值,如果考虑块要修改局部变量的值,我们可以用_block修饰局部变量
  

 


  
  1. _block int value = 20;
  2. void (^print)(void) = ^(void) {
  3. //会打印出45
  4. NSLog(@"%d", value);
  5. value = 40;
  6. //会打印出40
  7. NSLog(@"%d", value);
  8. }
  9. value = 45;
  10. print();
  11. //会打印出40
  12. NSLog(@"%d", value);

  用_block作为修饰的时候可以理解为传递指针到块里面去了,可以修改地址从而修改值
  用typedef定义块变量类型,格式如下
   typedef 块返回值类型 (^块变量类型)(形参类型1, 形参类型2)

   typedef void (^Print)(NSString *);


  
  1. Print print = ^(NSString *info)
  2. {
  3. NSLog(@"%@info", info);
  4. }
  5. print(@"chenyu");

   块有点像C语言里面的函数指针。

 

测试:


  
  1. typedef int (^Add) (int, int);
  2. typedef void (^Show) (NSString *);
  3. int main(int argc, char * argv[]) {
  4. @autoreleasepool {
  5. void (^pri)(void) = ^(void) {
  6. NSLog(@"hello world");
  7. };
  8. pri();
  9. Add add = ^(int a, int b) {
  10. return a + b;
  11. };
  12. int result = add(4, 5);
  13. NSLog(@"4 + 5 is: %d", result);
  14. Show show = ^(NSString * info) {
  15. NSLog(@"%@", info);
  16. };
  17. show(@"chenyu");
  18. }
  19. }

结果:


  
  1. hello world
  2. 4 + 5 is: 9
  3. chenyu

 

文章来源: chenyu.blog.csdn.net,作者:chen.yu,版权归原作者所有,如需转载,请联系作者。

原文链接:chenyu.blog.csdn.net/article/details/80877133

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。