iOS OC10_Block

內存五大區域

    //棧
    int a=10;
    NSLog(@"%p",a);
    //堆
    int *p=malloc(40);
    NSLog(@"%p",p);
    //全局
    static int b=10;
    NSLog(@"%p",b);
    //常量
    char *str="iphone";
    NSLog(@"%p",str);
    //代碼區
   NSLog(@"%p",maxValue);

結果

2015-07-28 19:07:07.976 OC10_Block[829:71750] 0xa
2015-07-28 19:07:07.977 OC10_Block[829:71750] 0x1001068d0
2015-07-28 19:07:07.977 OC10_Block[829:71750] 0xa
2015-07-28 19:07:07.977 OC10_Block[829:71750] 0x100001f75

Block的四種形式

//1.無參數,無返回值
 void(^block)()=^(){
 //函數大括號裏的代碼段
 NSLog(@"今天有點多雲");
 };
 //block的使用
 block();
 //block自己不會執行,必須調用纔會執行block大括號裏的代碼段

結果

2015-07-28 19:25:43.452 OC10_Block[1239:82416] 今天有點多雲
//2.有參數無返回值
void (^block)(int ,int)=^(int a,int b){
int max=a > b ? a : b;
NSLog(@"%d",max);
    };

//調用
block(10,20);
//void (^block)(int ,int)是block的類型,它的名是block,我們也通過名進行調用

結果

2015-07-28 19:27:08.121 OC10_Block[1249:82981] 20
//3.有返回值無參數
//有返回值在函數段的最後要加上return
int(^block)()=^(){

return 100;
};
//block調用時沒有參數也要加上括號
NSLog(@"%d",block());

結果

2015-07-28 19:28:07.938 OC10_Block[1256:83327] 100
    //4.有參數有返回值
    NSString *(^block)(NSArray *,NSInteger)=^(NSArray *arr,NSInteger index){
        return arr[index];
    };
    NSLog(@"%@",block(@[@"1",@"2"],1));

結果

2015-07-28 19:29:05.096 OC10_Block[1263:84049] 2

練習

    //返回整數,參數字符串
    NSInteger (^block)(NSString *)=^(NSString *str){
        return str.integerValue;
    };
    NSLog(@"%ld",block(@"111"));

結果

2015-07-28 19:30:42.921 OC10_Block[1271:85319] 111
    //參數日期字符串,返回NSDate類型的日期對象
    NSDate *(^block)(NSString *)=^(NSString *str){
        NSDateFormatter *formatter=[[NSDateFormatter alloc] init];
        [formatter setDateFormat:@"yyyy-MM-dd HH-mm-ss"];
        return [formatter dateFromString:str];
    };
    NSLog(@"%@",block(@"2015-07-28 10:12:12"));
    //block的函數段中更多使用參數,而返回值更多是調用一方使用

結果

2015-07-28 19:31:33.543 OC10_Block[1278:86117] 2015-07-28 02:12:12 +0000
//通過新的block寫一個block
    Block block=^(NSArray *arr){
        return arr[0];
    };
    //block和局部變量
    //__block相當於給a一個在block中修改的權限,否則他只能取值,不能賦值
    __block int a=10;
    void(^block)()=^(){
        a=10*a;
        NSLog(@"%d",a);
    };
    block();

結果

2015-07-28 19:33:14.295 OC10_Block[1301:87551] 100
    //通過block對數組進行遍歷
    NSArray *arr=[NSArray arrayWithObjects:@"1",@"2",@"3",@"4",@"5",@"6", nil];
    //系統的block
    [arr enumerateObjectsUsingBlock:^(NSString * obj, NSUInteger idx, BOOL *stop) {
        NSLog(@"%@",obj);
    }];
    //系統的block的用法就是回車

結果

2015-07-28 19:33:52.913 OC10_Block[1308:88218] 1
2015-07-28 19:33:52.914 OC10_Block[1308:88218] 2
2015-07-28 19:33:52.914 OC10_Block[1308:88218] 3
2015-07-28 19:33:52.914 OC10_Block[1308:88218] 4
2015-07-28 19:33:52.915 OC10_Block[1308:88218] 5
2015-07-28 19:33:52.915 OC10_Block[1308:88218] 6
    //數組排序
    //數組對字符串的排序
    //不可變的數組
NSArray*arr=@[@"zhangyangyang",@"wuhe",@"liushansahn",@"wangjunmin",@"yanglin"];
 //SEL是方法選擇器,他是方法選擇器的類型
NSArray*newArr[arrsortedArrayUsingSelector:@selector(compare:)];
NSLog(@"%@",newArr);
NSLog(@"%@",arr);

結果

2015-07-28 19:35:02.000 OC10_Block[1319:89130] (
    zhangyangyang,
    wuhe,
    liushansahn,
    wangjunmin,
    yanglin
)
    //可變數組
NSMutableArray*arr[NSMutableArrayarrayWithObjects:@"zhangyangyang",@"wuhe",@"liushansahn",@"wangjunmin",@"yanglin", nil];
[arr sortUsingSelector:@selector(compare:)];
NSLog(@"%@",arr);

結果

2015-07-28 19:36:27.541 OC10_Block[1326:90109] (
    liushansahn,
    wangjunmin,
    wuhe,
    yanglin,
    zhangyangyang
)
    //數組對對象的排序
    //新建四個人
    Person *per1=[Person baseWithName:@"yanglin" sex:@"nan"];
    Person *per2=[Person baseWithName:@"wuhe" sex:@"nan"];
    Person *per3=[Person baseWithName:@"cunmou" sex:@"nv"];
    Person *per4=[Person baseWithName:@"liushanshan" sex:@"nan"];
    //用字面量創建對象和便利構造器是一樣的
    NSArray *arr=@[per1,per2,per3,per4];

    //以學生的姓名作爲排序的依據
NSArray*newArr[arrsortedArrayUsingComparator:^NSComparisonResult(Person * obj1, Person* obj2) {
      return -[obj1.name compare:obj2.name];
  }];
    for (Person *per in newArr) {
       NSLog(@"%@",per.name);
    }

結果

2015-07-28 19:37:53.065 OC10_Block[1340:91155] yanglin
2015-07-28 19:37:53.066 OC10_Block[1340:91155] wuhe
2015-07-28 19:37:53.066 OC10_Block[1340:91155] liushanshan
2015-07-28 19:37:53.066 OC10_Block[1340:91155] cunmou
    Person *per1=[Person baseWithName:@"yanglin" sex:@"nan"];
    Person *per2=[Person baseWithName:@"wuhe" sex:@"nan"];
    Person *per3=[Person baseWithName:@"cunmou" sex:@"nv"];
    Person *per4=[Person baseWithName:@"liushanshan" sex:@"nan"];
        NSMutableArray *marr=[NSMutableArray arrayWithObjects:per1,per2,per3,per4, nil];
    [marr sortUsingComparator:^NSComparisonResult(id obj1, id obj2) {
        Person *per11=(Person *)obj1;
        Person *per22=(Person *)obj2;
        return [per11.name compare:per22.name];
    }];
    for (Person *per in marr) {
        NSLog(@"%@",per.name);
    }

結果

2015-07-28 19:38:59.851 OC10_Block[1347:91927] cunmou
2015-07-28 19:38:59.852 OC10_Block[1347:91927] liushanshan
2015-07-28 19:38:59.852 OC10_Block[1347:91927] wuhe
2015-07-28 19:38:59.852 OC10_Block[1347:91927] yanglin

補充

主函數之前

//    //C語言的函數
//    NSInteger maxValue(NSInteger a,NSInteger b){
//        return a > b ? a : b;
//    }


void test1()
{
    NSLog(@"今天真熱");
}

int addNum(int a,int b){
    return a+b;
}

typedef int DT;
//新的類型寫在*的後面,就是這裏的PFUN
typedef int (*PFUN)(int ,int ) ;
typedef NSString *(^Block)(NSArray *) ;
//有返回值,無參數
typedef NSInteger(^TestBlock)();
//
//  BaseModel.h
//  OC10_Block
//
//  Created by dllo on 15/7/28.
//  Copyright (c) 2015年 zhozhicheng. All rights reserved.
//

#import <Foundation/Foundation.h>

@interface BaseModel : NSObject

@property(nonatomic,copy)NSString *name;
@property(nonatomic,copy)NSString *sex;

-(id)initWithName:(NSString *)name
              sex:(NSString *)sex;


+(id)baseWithName:(NSString *)name
              sex:(NSString *)sex;




@end
//
//  BaseModel.m
//  OC10_Block
//
//  Created by dllo on 15/7/28.
//  Copyright (c) 2015年 zhozhicheng. All rights reserved.
//

#import "BaseModel.h"

@implementation BaseModel

-(id)initWithName:(NSString *)name
              sex:(NSString *)sex{
    self=[super init];
    if (self) {
        self.name=name;
        self.sex=sex;
    }return self;

}


+(id)baseWithName:(NSString *)name
              sex:(NSString *)sex{
    //多態方式完成
    id obj =[[[self class] alloc] initWithName:name sex:sex];
    return obj;
}

@end
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章