加入收藏 | 设为首页 | 会员中心 | 我要投稿 汽车网 (https://www.0577qiche.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 教程 > 正文

IOS之学习笔记二块

发布时间:2023-03-27 11:09:51 所属栏目:教程 来源:
导读:1、逗号表达式,返回整个逗号表达式的返回值是最后一个表达式的返回值,长见识了,第一次听说,比如 int x = (a = 3, a = 4, a = 5, a = 6); NSLog(@"x is %d", x);x is 62、iOS 有如下三种随机数方法: 1)、srand(
1、逗号表达式,返回整个逗号表达式的返回值是最后一个表达式的返回值,长见识了,第一次听说,比如 int x = (a = 3, a = 4, a = 5, a = 6); NSLog(@"x is %d", x);x is 62、iOS 有如下三种随机数方法: 1)、srand((unsigned)time(0)); //不加这句每次产生的随机数不变 int i = ran...

语音解读
图文解释
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(0)); //不加这句每次产生的随机数不变
    int i = rand() % 5;
    2)、srandom(time(0));
    int i = random() % 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);
 
   一般使用

   #import <Foundation/Foundation.h>
   
   int main(int argc,char * argv[]) {
        @autoreleasepool {
        void (^printStr)(void) = ^(void) {
                NSLog(@"我在学习oc的块");
        };
            printstr();
            int (^sum)(int,int) = ^(int a,int b) {
            return a + b;
        };
            NSLog(@"sum is %d",sum(a,b));
            void (^print)(Nsstring) =  ^(Nsstring *info) {
            NSLog(@"info value is %@",info);
        };
            print(@"chenyu");
        }
   }
 


   块可以访问局部变量的值,但是不许修改,因为传递进去的是值,不是地址,所以不能修改,following
   下面代码会引起错误
 
 int value = 20;
   void (^print)(void) = ^(void) {
       value = 30;
       NSLog(@"%d",value);
   }
   value = 45;
   print();
 
   看下面的例子
 
 int value = 20;
   void (^print)(void) = ^(void) {
       NSLog(@"%d",value);
   }
   value = 45;
   print();

   结果打印是20,我们不是修改了成了45吗?当程序用块访问局部变量时,系统在定义块会把局部变量的值保存在块中,而不是等到执行时才去访问获取变量的值,如果考虑块要修改局部变量的值,我们可以用_block修饰局部变量
  
_block  int value = 20;
   void (^print)(void) = ^(void) {
       //会打印出45
       NSLog(@"%d",value);
       value = 40;
       //会打印出40
       NSLog(@"%d",value);
   }
   value = 45;
   print();
   //会打印出40
   NSLog(@"%d",value);
  用_block作为修饰的时候可以理解为传递指针到块里面去了,可以修改地址从而修改值
  用typedef定义块变量类型,格式如下
   typedef 块返回值类型 (^块变量类型)(形参类型1,形参类型2)

   typedef void (^Print)(Nsstring *);

   Print print = ^(Nsstring *info)
   {
       NSLog(@"%@info",info);
   }
   print(@"chenyu");
   块有点像C语言里面的函数指针。

测试:

typedef int (^Add) (int,int);
typedef void (^Show) (Nsstring *);
int main(int argc,char * argv[]) {
    @autoreleasepool {
        void (^pri)(void) = ^(void) {
            NSLog(@"hello world");
        };
        pri();
        Add add =  ^(int a,int b) {
            return a + b;
        };
        int result = add(4,5);
        NSLog(@"4 + 5 is: %d",result);
        Show show = ^(Nsstring * info) {
            NSLog(@"%@",info);
        };
        show(@"chenyu");
    }
}
结果:

hello world
4 + 5 is: 9
chenyu
 

(编辑:汽车网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章