OC语言(六)
四十六.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协议
@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可以提高性能。
如果一个协议只用到某个类中,可以把协议定义在这个类中。
如果多个类用到,应该是单独的文件。
分类也有写在某个类中的,只要求能看懂语法(系统自带)。
四十八.代理设计模式
//
// 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框架
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深入
NSString *s1 = @"12345";
//NSString *s2 = [[NSString alloc] initWithString:@"12345"];
s1 = [[NSString alloc] initWithFormat:@"12345"];
s1 = [[NSString alloc] initWithUTF8String:"12345”];
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对象方法返回一个新的字符串,与上面改变自身不同。
五十一.集合类
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语言(六)的更多相关文章
- iOS开发-OC语言 (六)点语法和@property
点语法和@property 知识点 1.setter/getter函数 2.点语法 3.@property语法和属性 ======================================== ...
- oc语言学习之基础知识点介绍(二):类和对象的进一步介绍
一.类.对象在内存中的存储 /* 内存分区: 栈:局部变量 堆:程序员自己写代码申请开辟的 程序员自己维护,编译器现在帮我们自动优化了,它在合适的给我们加上了释放空间的语句,所以我们现在写的对象不会造 ...
- OC的特有语法-分类Category、 类的本质、description方法、SEL、NSLog输出增强、点语法、变量作用域、@property @synthesize关键字、Id、OC语言构造方法
一. 分类-Category 1. 基本用途:Category 分类是OC特有的语言,依赖于类. ➢ 如何在不改变原来类模型的前提下,给类扩充一些方法?有2种方式 ● 继承 ● 分类(Categor ...
- OC语言(一)
一.概述 1.基本上所有关键词@开头 2.字符串以@开头,如@"Hello" 3.基本数据类型 char int float double BOOL(YES\NO) 4.空为nil ...
- swift调用oc语言文件,第三方库文件或者自己创建的oc文件——简书作者
Swift是怎样调用OC的第三方库的呢?请看下面详情: 情况一: 1.首先打开Xcode,iOS->Application->Single View Application, 选Next. ...
- OC语言前期准备
OC语言前期准备 一.OC简介 Oc语言在c语言的基础上,增加了一层最小的面向对象语法,完全兼容C语言,在OC代码中,可以混用c,甚至是c++代码. 可以使用OC开发mac osx平台和ios平台的应 ...
- OC语言基础知识
OC语言基础知识 一.面向对象 OC语言是面向对象的,c语言是面向过程的,面向对象和面向过程只是解决问题的两种思考方式,面向过程关注的是解决问题涉及的步骤,面向对象关注的是设计能够实现解决问题所需功能 ...
- OC语言@property @synthesize和id
OC语言@property @synthesize和id 一.@property @synthesize关键字 注意:这两个关键字是编译器特性,让xcode可以自动生成getter和setter的声明 ...
- OC语言构造方法
OC语言构造方法 一.构造方法 (一)构造方法的调用 完整的创建一个可用的对象:Person *p=[Person new]; New方法的内部会分别调用两个方法来完成2件事情,1)使用alloc方法 ...
- OC语言类的本质和分类
OC语言类的深入和分类 一.分类 (一)分类的基本知识 概念:Category 分类是OC特有的语言,依赖于类. 分类的作用:在不改变原来的类内容的基础上,为类增加一些方法. 添加一个分类: 文件 ...
随机推荐
- 浏览器加载和渲染html的顺序(html/css/js)
最近在学习前端的技术,把html.js.css的基础知识看了看.感觉越看越觉得前端并不比后端容易,技术含量还是相当大的.今天突然想弄明白浏览器到底是怎么加载和渲染html的?html中的DOM.js文 ...
- Twitter 架构优化之路--Twitter是如何做到每秒处理3000张图片的
如今,Twitter每秒可以创建并保存3000张(20GB)的图片.2015年,Twitter甚至从对媒体存储策略的优化中节省出了600万美元. 但并非一开始就是这样的,2012年Twitter还主要 ...
- Android图表库MPAndroidChart(十四)——在ListView种使用相同的图表
Android图表库MPAndroidChart(十四)--在ListView种使用相同的图表 各位好久不见,最近挺忙的,所有博客更新的比较少,这里今天说个比较简单的图表,那就是在ListView中使 ...
- Redis 学习笔记4: Redis 3.2.1 集群搭建
在CenOS 6.7 linux环境下搭建Redis 集群环境 1.下载最新的Redis版本 本人下载的Redis版本是3.2.1版本,下载之后,解压,编译(make): 具体操作可以参考我的博文:R ...
- 微信小程序之最简单的Demo设计使用
这个小Demo,代码量不多:导航样式.View.Text.点击.JS交互的使用,主要是理解每个后缀文件的功能,然后才能更好的使用开发.......(下面代码和源代码没差别,实在想要的请留言,谢谢... ...
- Java基本语法-----java注释
1注释的作用 通过注释提高程序的可读性,是java程序的条理更加清晰,易于区分代码行与注释行.另外通常在程序开头加入作者,时间,版本,要实现的功能等内容注释,方便后来的维护以及程序员的交流. 2注释的 ...
- Android简易实战教程--第二十四话《画画板》
今天完成一个画画板. 首先来个布局: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android ...
- FORM执行查询的各种方法
一.FORM调用FORM后执行查询 1.打开 APPSTAND.fmb,把 Object Groups 下的 QUERY_FIND 对象组拖动到自己的 form 中的 Object Groups ...
- ExtJS学习(二)Ext组件模型
Ext中所有的组件都继承自Ext.component,这种单根继承的模型保证所有组件都拥有相同的通用方法与生命周期,这样在后续对这些组件进行维护管理时将更加便捷,同时也保证了在进行布局时的便利. 组件 ...
- Cocos2D v3.4.9粒子效果不能显示的原因分析及解决办法
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) 在游戏App中为了衬托气氛我们往往使用一些特殊的图形效果,粒子 ...