四十六.block类型


用来封装代码,可以在任何时候执行。
与函数的区别:可以在运行时动态产生。

block的标志:^

有形参、有返回值

int (^sumblock)(int,int) = ^(int a, int b){

NSLog(@"a + b = %d",a+b);

return a+b;

};

sumblock(,);

注意结尾的分号。很像函数指针。

函数指针的写法:

int (*p)(int, int) = sum;

如果block没有形参,可以省略()。

用typedef来简化

简化函数指针int (*p)(int, int)

typedef int (*SumP)(int, int);

简化block

typedef int (^MyBlock)(int, int);

#import <Foundation/Foundation.h>

typedef int (^MyBlock)(int, int);

int main(int argc, const char *
argv[]) {

MyBlock sumBlock = ^(int a, int b){

NSLog(@"a + b = %d",a+b);

return a+b;

};

sumBlock(,);

;

}

block总结:

block可以直接访问外部变量,默认情况下,block内部不能修改外面的局部变量,给局部变量加上__block关键字就可以修改。

四十七.protocol协议


注意拼写。

两种设计模式:代理模式和观察者模式。

主要用于代理模式。

类似Java中的接口。

在Objectvie-C File中选择创建。
只要类遵守协议,就能使用协议的所有方法。

< >表示遵守协议

protocol的参数:

1.必须实现:@required(默认),不一定必须:@optionnal。
这两个关键字主要用于程序员交流。
不实现不报错,只是警告。

@protocol MyProtocol <NSObject>

@required

- (void)test;

@optional

- (void)test2;

@end

#import "MyProtocol.h"

@interface Person
: NSObject <MyProtocol>

@end

2.只要某个类遵守,就相当于子类也遵守了。

3.遵守多个协议(Java中也可以继承多个接口)

#import "MyProtocol.h"

#import "MyProtocol2.h"

@interface Person : NSObject <MyProtocol, MyProtocol2>

@end

4.基协议(类似基类,一个协议可以遵守其他协议)

#import "MyProtocol.h"

@protocol MyProtocol2
<MyProtocol>

默认的基协议是NSObject,是默认遵守的。

由于基类遵守基协议,因此所有OC对象都遵守基协议,才有retain、release等内容。

写协议一定要最终遵守NSObject。

5.要求某个类必须遵守某个协议

类名<协议> *obj = ……

Person<MyProtocal2> *p = [[Person alloc] init];

类似于@class,可以用@protocol来告诉编译器这是一个协议,但是真正用到协议,还是得在相应的位置加上protocol的.h文件。

用@protocol可以提高性能。

如果一个协议只用到某个类中,可以把协议定义在这个类中。

如果多个类用到,应该是单独的文件。

分类也有写在某个类中的,只要求能看懂语法(系统自带)。

四十八.代理设计模式


注意降低耦合性(删掉代理原来的类不能受影响)

需求:Person对象委托Other对象给他买电影票。

一个类的某些工作依靠其他类来工作,但并不需要知道内部原理。

注意使用id来降低耦合性,在id后加上具体协议<>来保证可以调用相应的方法。

所有方法都使用protocol来声明,命名为XxxDelegate。

//

//  TicketDelegate.h

//  代理模式

//

//  Created by 11 on 2/1/15.

//  Copyright (c) 2015 11. All rights reserved.

//

#import <Foundation/Foundation.h>

@protocol TicketDelegate <NSObject>

- (double) ticketPrice;

- (int) leftTicketsNum;

@end

//

//  Agent.h

//  代理模式

//

//  Created by 11 on 2/1/15.

//  Copyright (c) 2015 11. All rights reserved.

//

#import <Foundation/Foundation.h>

#import "TicketDelegate.h"

@interface Agent : NSObject <TicketDelegate>

@end

//

//  Agent.m

//  代理模式

//

//  Created by 11 on 2/1/15.

//  Copyright (c) 2015 11. All rights reserved.

//

#import "Agent.h"

@implementation Agent

- (double) ticketPrice{

;

}

- (int) leftTicketsNum{

;

}

@end


Person *p = [[Person alloc] init];

Agent *a = [[Agent alloc] init];

p.delegate = a;

[p buyTicket];

代理的实例:

UITableView,通过代理设置要显示的表格数量和内容。

还有个数据源UITableViewDataSource,它是一个协议。

四十九.Foundation框架


Foundation是基础的意思,这是一个基础框架。
包括了结构体、枚举、类。

想用框架的所有部分,只需要包含其主头文件。

注意结构体内部的点语法是直接访问结构体成员,不是get和set,get和set是对象特有的。

**NS与CG区别,NSMakeXxx,CGXxxMake。

1.NSRange 表示范围

typedef struct _NSRange {

NSUInteger location;

NSUInteger length;

} NSRange;

例如表示@“I love OC”中的”love",则location = 2,length = 4

结构体的赋值:直接用XXMake函数。

从字符串中取出子串的range:

NSString *str = @"I love OC";

NSRange r2 = [str rangeOfString:@"love”];

找不到返回location=-1。(NSNotFound = -1)

加入CoreGraphics框架后再使用!

2.CGPoint

struct CGPoint {

CGFloat x;

CGFloat y;

};

typedef CGPoint NSPoint;

CGPoint和NSPoint是等价的。应该用CGPoint。

用CGPointMake函数产生。

3.CGSize

struct CGSize {

CGFloat width;

CGFloat height;

};

typedef struct CGSize CGSize;

4.CGRect

包含了点跟尺寸。

struct CGRect {

CGPoint origin;

CGSize size;

};

typedef struct CGRect CGRect;

打印结构体的方法:NSStringFromXxx

例如:

NSStringFromPoint(p1);

结构体赋值的其他方法:

1.{x,x, …},对于结构体内有结构体 { {x,x,…},{x,x,…},…}

2.已有的常量,如(0,0)点,可以用CGPointZero。几乎每个都有自己的Zero常量。

3.判断全等:XxxEqualToXxx(Xxx1,Xxx2)。

4.判断是否包含:, , , ), , ));

遇到莫名其妙的问题可以clean工程。

要加入框架才能使用高级函数(Xcode6以后似乎不需要主动加入框架):

要有这个框架,才能使用CG系列的高级函数(高版本的Xcode似乎可以不引入- -)。

//NS的来历:NextStep公司设计出的Foundation框架

五十.NSString深入


NSMutableString是可变字符串,它是NSString的子类。

字符串的创建:

NSString *s1 = @"12345";

//NSString *s2 = [[NSString alloc] initWithString:@"12345"];

s1 = [[NSString alloc] initWithFormat:@"12345"];

s1 = [[NSString alloc] initWithUTF8String:"12345”];

C语言字符串转OC字符串:

s1 = [[NSString alloc] initWithUTF8String:"12345”];

OC转C:

const char* c1 = [s1 UTF8String];

从文件中读取:

s1 = [[NSString alloc] initWithContentsOfFile:@“url" encoding:NSUTF8StringEncoding error:nil];

从URL获取:

协议头:

http:// 网络资源

file:// 本地资源

ftp://  FTP资源

具体实现

注意协议头的//和目录的/都要写

NSURL *url = [[NSURL alloc] initWithString:@"file:///Users/soulghost/Documents/1.txt"];

s1 = [[NSString alloc] initWithContentsOfURL:url encoding:(NSUTF8StringEncoding) error:nil];

可以不用alloc,有相应的类方法可以调用。

注意一个细节,id返回值的类方法已经被抛弃,以instancetype作为返回值可以在一些违法类型类方法的时候发出警告(例如模型对象转化为NSString调用字符串的对象方法)。

但是instancetype只能用在返回值,任意类型还是要用id。

规律:类名开头。

URL免去协议头:fileURLWithPath为file://开头。

将字符串写入文件:

atomically为原子性操作,中途失败不创建。

NSURL *url1 = [[NSURL alloc] initWithString:@"file:///Users/soulghost/Documents/my.txt"];

[s1 writeToFile:url1 atomically:YES encoding:NSUTF8StringEncoding error:nil];

还有writeToURL方法可以写入URL中。

文件里的每一个换行都是一个’\n’

NSMutableString可变字符串

拼接的类方法:

NSMutableString *s1 = [NSMutableString stringWithFormat:@"age is 10"];

[s1 appendFormat:@"
wahaha”];

删除其中的is:

[s1 deleteCharactersInRange:[s1 rangeOfString:@"is"]];

注意NSString有stringByAppendingString对象方法返回一个新的字符串,与上面改变自身不同。

五十一.集合类


三个集合类
1.NSArray(不可变数组,改变后只能是生成新数组)
NSArray以面向对象的方式操纵数组。
缺点是只能存放OC对象(struct不是OC对象)。

创建空数组

NSArray *array = [NSArray array];

创建多元素数组:注意nil是结束标志,OC数组不能存放空值。

array = [NSArray arrayWithObjects:@"jack", @"rose", nil];

count对象方法可以得到对象个数。也可以用点语法。

注意count返回的是unsigned long。

获取对象:objectAtIndex对象方法。也可以写索引方式array[x](编译器特性)。

数组初始化的编译器特性:

array = @[@"jack",@"rose”];

NSArray的遍历:

OC中的范围for仍然用for,语法为 id xx in xx

for (id obj in array){

NSLog(@"%@",obj);

}

使用block(在block的提示上回车就可以生成默认代码块)

[array enumerateObjectsUsingBlock:

^(id obj, NSUInteger idx, BOOL *stop) {

NSLog(@"obj = %@, idx = %ld",obj,idx);

}];

在block中停止遍历的方法:

*stop = YES;

block遍历的本质也是一个for循环,在for循环中不断的执行block,并且把bool的地址传进去,这样才能改变bool变量。

2.NSMutableArray

NSMutableArray *marray = [NSMutableArray array];

[marray addObject:@"jack"];

[marray addObject:@"rose”];

初始化不可以使用@初始化。

删除元素:

使用removeObject...方法

3.NSSet

与数组的区别是无序。

方法就是把Array替换为Set。

取出NSSet中元素:anyObject方法随机返回对象。

NSMutableSet与前面一样,删除对象有removeObject:id与removeAllObject。

4.NSDictionary类似java中的map

初始化:

NSDictionary *dict = [NSDictionary dictionaryWithObjects:@[@"jack",@"john"] forKeys:@[@"name1",@"name2"]];

NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:@"jack",@"name1",@"john",@"name2", nil];

注意先value后key。

快速初始化Dictionary,以@开头。也是编译器特性。

dict = @{@"name1":@"jack",@"name2":@"john"};

取出值的编译器特性,dict[@"name1”];

5.NSMutableDictionary

创建空的:

NSMutableDictionary *mdict = [NSMutableDictionary dictionary];

添加元素:

重复的key会将value更新。

删除元素:

-removeObjectForKey

字典的遍历:

取出key的方法:

NSArray *keys = [dict allKeys];

或者:

[dict enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop)
{

NSLog(@"%@:%@",key,obj);

}];

6.将基本类型装入集合

先将基本数据类型进行包装。

NSNumber对象,+numberwithXxx方法

NSNumber转回基本数据类型,-intValue -xxxValue(其他类型也可以这么解析,例如NSString转数字)

编译器特性,@+基本数据类型=NSNumber对象,如@20,@YES自动生成NSNumber对象。

对于变量 @(<变量名>)

NSNumber只能包装数字。

要包装结构体,用NSValue。它可以包装任何东西。

7.NSDate

NSDate *date = [NSDate date];

sinceDate:date];

NSTimeInterval secs = [date timeIntervalSince1970];

日期格式化:H为24小时制,h为12小时制。y M d H/h m s。

NSDateFormatter *formatter = [[NSDateFormatter alloc] init];

formatter.dateFormat = @"yyyy-MM-dd HH:mm:ss";

NSString *str = [formatter stringFromDate:date];

OC语言(六)的更多相关文章

  1. iOS开发-OC语言 (六)点语法和@property

    点语法和@property 知识点 1.setter/getter函数 2.点语法 3.@property语法和属性 ======================================== ...

  2. oc语言学习之基础知识点介绍(二):类和对象的进一步介绍

    一.类.对象在内存中的存储 /* 内存分区: 栈:局部变量 堆:程序员自己写代码申请开辟的 程序员自己维护,编译器现在帮我们自动优化了,它在合适的给我们加上了释放空间的语句,所以我们现在写的对象不会造 ...

  3. OC的特有语法-分类Category、 类的本质、description方法、SEL、NSLog输出增强、点语法、变量作用域、@property @synthesize关键字、Id、OC语言构造方法

    一. 分类-Category 1. 基本用途:Category  分类是OC特有的语言,依赖于类. ➢ 如何在不改变原来类模型的前提下,给类扩充一些方法?有2种方式 ● 继承 ● 分类(Categor ...

  4. OC语言(一)

    一.概述 1.基本上所有关键词@开头 2.字符串以@开头,如@"Hello" 3.基本数据类型 char int float double BOOL(YES\NO) 4.空为nil ...

  5. swift调用oc语言文件,第三方库文件或者自己创建的oc文件——简书作者

    Swift是怎样调用OC的第三方库的呢?请看下面详情: 情况一: 1.首先打开Xcode,iOS->Application->Single View Application, 选Next. ...

  6. OC语言前期准备

    OC语言前期准备 一.OC简介 Oc语言在c语言的基础上,增加了一层最小的面向对象语法,完全兼容C语言,在OC代码中,可以混用c,甚至是c++代码. 可以使用OC开发mac osx平台和ios平台的应 ...

  7. OC语言基础知识

    OC语言基础知识 一.面向对象 OC语言是面向对象的,c语言是面向过程的,面向对象和面向过程只是解决问题的两种思考方式,面向过程关注的是解决问题涉及的步骤,面向对象关注的是设计能够实现解决问题所需功能 ...

  8. OC语言@property @synthesize和id

    OC语言@property @synthesize和id 一.@property @synthesize关键字 注意:这两个关键字是编译器特性,让xcode可以自动生成getter和setter的声明 ...

  9. OC语言构造方法

    OC语言构造方法 一.构造方法 (一)构造方法的调用 完整的创建一个可用的对象:Person *p=[Person new]; New方法的内部会分别调用两个方法来完成2件事情,1)使用alloc方法 ...

  10. OC语言类的本质和分类

    OC语言类的深入和分类 一.分类 (一)分类的基本知识  概念:Category  分类是OC特有的语言,依赖于类. 分类的作用:在不改变原来的类内容的基础上,为类增加一些方法. 添加一个分类: 文件 ...

随机推荐

  1. Bootstrap3 排版-缩略语

    当鼠标悬停在缩写和缩写词上时就会显示完整内容,Bootstrap 实现了对 HTML 的 <abbr> 元素的增强样式.缩略语元素带有 title 属性,外观表现为带有较浅的虚线框,鼠标移 ...

  2. 给PLSQL插上飞翔的翅膀-PLSQL优化

    60-80% of database performance issues are related to poorly performing SQL,60-80%的数据库性能问题要归结于生产中糟糕的S ...

  3. Common-used commands in Docker

    1. Start running a image in background mode docker run -it -d <image>:<tag> e.g. docker ...

  4. win 8.1 64位彻底删除王码98

    安全模式 C:\Windows\SysWOW64\ 删除:winwb98.IME和winwb98.MB 注册表: 找到王码五笔相关的项.一般在最下面的以字母E开头的文件夹.全部删除. HKEY_LOC ...

  5. Java使用BigDecimal保留double、float运算精度、保留指定位数有效数字、四舍五入

    工具类 package --; import java.math.BigDecimal; /** * Created by kongqw on 2015/12/10. */ public final ...

  6. 使用OpenCV读、操作、写图像并与bash合作对某个目录下所有图像进行类似处理

    我门要对某个目录下所有图像文件进行统一处理,如果图像的数量过多,那么手动地一张张处理就会显得有些麻烦.本文使用OpenCV和bash来完成我们指定的任务. 任务 将目录A下的所有统一格式的jpg图像变 ...

  7. 微信小程序之最简单的Demo设计使用

    这个小Demo,代码量不多:导航样式.View.Text.点击.JS交互的使用,主要是理解每个后缀文件的功能,然后才能更好的使用开发.......(下面代码和源代码没差别,实在想要的请留言,谢谢... ...

  8. iOS编程Cookbook第19章最后一个例子不能正常工作的解决办法

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) 在Cookbook的第19章的11节中所要解决的是在App中显 ...

  9. React Native开发工具Nuclide使用

    之前写RN的时候首选webstorm,这是之前做前端已经习惯的工具,其实RN开发官网推荐的是Nuclide工具, Nuclide是Fackbook专门为React开发IDE,今天也来尝试下,如果对we ...

  10. 聊聊Condition

    本文可作为传智播客<张孝祥-Java多线程与并发库高级应用>的学习笔记. 上面我们说了Lock,那是对synchronized的一种更为面向对象的替代,在原来的synchronized内部 ...