目录
1. 语法特性
2. 控制语句
3. 数据结构
4. 数据类型
1.语法特性
OC:面向对象
封装
将所有事物都封装为类(方便复用,安全)
继承
子类继承父类的所有属性和方法(减少冗余)
多态
动态运行时语言(方便复用)简单的说,就是一句话:允许将子类类型的指针赋值给父类类型的指针。
动态类型(只有在运行时才能确定对象的类型,如id修饰的对象/父类指针传入子类对象。RunTime机制可以动态替换或添加方法)
动态绑定(对象的类型确定后,其所对应的属性和方法就确定了)
动态加载(在运行时根据需要加载所需资源:如@2x@3x图片)
2. 控制语句
同Java同C 都是以C为基础
2.1. 判断语句
if判断
判断条件---非0则真(1) 为真则真(@"sb"!= nil) 非假则真( !0 )
if(i==1){
}else if(i==2){
}else{
}
switch判断
当条件多于3个时使用switch
switch(x){ // 只能是整型、char
case 1:{
// 多个语句时必须加{},否则报错
break;
}
default:
}
2.2 循环语句
for循环
for(int i=0;i<10;i++){ // 1可省(写在上面) 3可省(写在里面)
}
for(id item in array){
}
for(id key in dict.allKeys){
dict[key]
}
for(id value in dict.allValues){
}
where循环
while(i<10){
}
do{
}while(i<10);
break; 跳出循环
continue; 跳出本次循环,开始下次循环
3. 数据结构
数据结构:计算机组织存储数据的方式。
数据之间的相互关系称为结构,分为逻辑结构和物理结构。
逻辑结构:
集合结构(所有数据的数据类型相同)、
线性结构(一对一)、
树性结构(一对多)、
图像结构(多对多)
物理结构:
栈(由编译器自动管理)、
堆(需要手动创建并管理,容易造成内存泄漏)、
队列、
链表(数据在内存中是不连续的,通过节点中的指针联系在一块)、
数组(数据在内存中是连续的,每个元素所占内存相同,可通过下标迅速访问)
内存的分区情况:
代码区(存放程序代码)
数据区(存放常量、全局变量、静态变量)
堆区(由程序员手动申请并释放)
栈区(由编译器管理,局部变量、函数参数)
4.数据类型
分为
基本数据类型
枚举、结构体、类类型
4.1.基本数据类型
int(默认值为0)
float
double
char
BOOL(默认:false,非0则真 , !真则假)
NSInteger
4.2.枚举
方式一
将有限个相关值合在一起
typedef enum{ // 定义+取别名
TypeA=0,
TypeB,
}Type;
Type type=TypeA;
enum Type{ // 定义
TypeA=0,
TypeB,
};
enum Type type=TypeA;
方式二
推荐使用---混编时不报错
typedef NS_ENUM(NSInteger,TYPE){
TYPE_ADD,
TYPE_SUB,
};
typedef NS_OPTIONS(NSInteger, TYPE){
TYPE_ADD = 1 << 0, // 2的0次方
TYPE_SUB = 1 << 1, // 2的1次方
};
@property (nonatomic,assign) TYPE type;
有 << 则可以使用 | (如:TYPE_ADD|TYPE_SUB)
int type=TYPE_ADD|TYPE_SUB type&TYPE_ADD为TYPE_ADD的值则有TYPE_ADD
原理:
int value = TYPE_ADD | TYPE_SUB;
转成二进制:
TYPE_ADD: 0 0 0 1
|
TYPE_SUB: 0 0 1 0
----------------
value: 0 0 1 1
上面是使用 | 得出value的值为0011 (|的意思是有一个为1结果就为1)
下面是使用 & 判断输出的值(&的意思就是有二个为1结果才为1)
value: 0 0 1 1 value: 0 0 1 1
& &
nameA: 0 0 0 1 nameB: 0 0 1 0
---------------- ----------------
结果值: 0 0 0 1 结果值: 0 0 1 0
4.3. 结构体
不能封装行为
struct Person{ // 定义
char *name;
int age;
};
typedef struct Person MyPerson; // 取别名
typedef struct{ // 定义+取别名
char *name;
int age;
}MyPerson;
//
MyPerson person={"xiaoming",15};
struct Person person={"xiaoming",15};
//
person.name="xiaozhang";
person.age=21;
//
struct Person *person1=&person;
person1->name="xiaozhang"; // 不能使用 .
person1->age=21;
4.4 类类型
系统类类型
非集合类
NSNumer(基础数据类型互转对象类型)(例:@15, [num integerValue])
NSString、NSMutableString
NSDate
集合类
NSArray、NSMutableArray (只能存储对象类型)
NSDictionary、NSMutableDictionary (只能存储对象类型)
NSSet
自定义类类型
自定义类名 继承:NSObject
NSObject-所有对象类型的基类
id可以是任意类类型(OC动态运行时语言:只有在运行时才能确定变量的类型)(id a=dog 没有*,id自带*)
父类 *f=子实例; [f 子独有方法]; 编译时不会报错,运行时崩
- 系统类类型
NSString
创建方式
NSString *contentStr=@"";
NSString *contentStr=[NSString stringWithString:@""];
NSString *contentStr=[NSString stringWithFormat:@"%@",@""];
NSString *contentStr=[[NSString alloc]initWithFormat:@"%@",@""];
改
// 追加字符串(生成的是新的字符串)
NSString *newStr=[contentStr stringByAppendingString:@""];
NSString *newStr=[contentStr stringByAppendingFormat:@"%@",@""];
// 截取字符串
[contentStr substringFromIndex:0];
[contentStr substringWithRange:NSMakeRange(0, 10)];
[contentStr substringToIndex:10];
// 字符串->array
NSArray *arr=[contentStr componentsSeparatedByString:@","];
// 转大小写
NSString *upStr=[contentStr uppercaseString];
NSString *lowStr=[contentStr lowercaseString];
查
// 字符串的长度
NSUInteger length=contentStr.length;
// 字符串某位置的字符
unichar xChar=[contentStr characterAtIndex:0];
// 字符串是否相同
[contentStr isEqualToString:@"ddd"]
// 某字符串的range
NSRange range=[contentStr rangeOfString:@"xx"];
// 是否不包含字符串xx
[contentStr rangeOfString:@"xx"].location == NSNotFound
// 是否包含某字符串xx
BOOL isHave=[contentStr containsString:@"xx"];
// 是否有 前缀xx/后缀xx
[contentStr hasPrefix:@"xx"];
[contentStr hasSuffix:@"xx"];
// 共同的前缀
[contentStr commonPrefixWithString:@"xx123" options:NSLiteralSearch];
NSMutableString : NSString
// 创建
NSMutableString *muStr=[NSMutableString stringWithString:@""];
NSMutableString *muStr=[NSMutableString stringWithFormat:@"%@",@""];
NSMutableString *muStr=[NSMutableString stringWithCapacity:10];
改
// 插入
[muStr insertString:@"" atIndex:0];
// 删除
[muStr deleteCharactersInRange:NSMakeRange(0, 10)];
// 追加
[muStr appendString:@""];
[muStr appendFormat:@"%@",@""];
NSArray
// 创建
NSArray *arr1 = [[NSArray alloc] initWithObjects:@"a", @"b", @"c", nil];
NSArray *arr11= [[NSArray alloc] initWithArray:arr1];
NSArray *arr12= [[NSArray alloc] arrayWithArray:arr1];
NSArray *arr2 = [NSArray arrayWithObjects:@"a", @"b", @"c", nil]; // 类方法
NSArray *arr3 = @[@"a", @"b", @“c”,@1,@YES]; // 元素不可nil,否则崩
改
// 追加(生成新数组)
NSArray *newArr=[arr arrayByAddingObjectsFromArray:@[]];
NSArray *newArr=[arr arrayByAddingObject:@""];
// array->str
NSString *str=[arr componentsJoinedByString:@","];
查
arr.count
[arr count]
arr[0]
[arr firstObject]
[arr lastObject]
// 是否包含某元素
BOOL isHave=[arr containsObject:@""];
NSMutableArray
创建
NSMutableArray *mutArr = [@[@"a", @"b", @"c"] mutableCopy]; // 转mutable
NSMutableArray *mutArr = [[NSMutableArrary alloc]initWithCapacity:10]; // 预存放大小
NSMutableArray *mutArr = [[NSMutableArray alloc]init];
NSMutableArray *mutArr = [NSMutableArray array];
NSMutableArray *mutArr = [[NSMutableArray alloc]initWithObjects:@“”,@“”,nil];
NSMutableArray *mutArr = [NSMutableArray arrayWithObjects:@“”,@“”,nil];
NSMutableArray *mutArr = [[NSMutableArray alloc]initWithArray:arr1];
NSMutableArray *mutArr = [NSMutableArray arrayWithArray:arr1];
改
// 增
[mutArr addObject:@“12”];
[mutArr addObjectsFromArray:@[@"",@""]];
[mutArr insertObjectAtIndex:0];
[mutArr insertObjects:@[@"",@""] atIndexes:[NSIndexSet indexSetWithIndex:0]];
// 删
[mutArr removeObject:@“12”];
[mutArr removeObjectAtIndex:0];
[mutArr removeObjectsAtIndexes:[NSIndexSet indexSetWithIndex:0]];
[mutArr removeObjectsInRange:NSMakeRange(1,1)]; // 从1删长度1
[mutArr removeObject:@"xx" inRange:NSMakeRange(0, 10)];
[mutArr removeObjectsInArray:@[@"",@""]];
[mutArr removeLastObject];
[mutArr removeFirstObject];
[mutArr removeAllObjects];
// 换
[mutArr exchangeObjectAtIndex:0 withObjectAtIndex:1];
[mutArr replaceObjectAtIndex:0 withObject:@""];
[mutArr replaceObjectsAtIndexes:[NSIndexSet indexSetWithIndex:0] withObjects:@[@"",@""]];
[mutArr replaceObjectsInRange:NSMakeRange(0, 10) withObjectsFromArray:@[@"",@""]];
[mutArr replaceObjectsInRange:NSMakeRange(0, 10) withObjectsFromArray:@[@"",@""] range:NSMakeRange(0, 1)];
查
id item=[mutArr objectAtIndex:0];
NSInteger index=[mutArr indexOfObject:item];
id item=[mutArr firstObject];
id lastItem=[mutArr lastObject];
BOOL isHave=[mutArr contatinsObject:@“”];
for (int i=0;i<[mutArr count];i++){ // for循环
}
NSDictionary
// 创建
NSDictionary *dict1 = [NSDictionary dictionaryWithObjectsAndKeys:@"vA", @"kA",@"vB", @"kB",nil];
NSDictionary *dict2 = [[NSDictionary alloc] initWithObjectsAndKeys:@"vA", @"kA",@"vB", @"kB",nil];
NSDictionary *dict3 = @{@"kA":@"vA",@"kB":@"vB"}; // 元素不可nil,否则崩
NSDictionary *dict4 = [[NSDictionary alloc] initWithDictionary:dict1];
data<->dict
// data->dict
NSDictionary *dict=[NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:nil];
// dict->data
NSData *data=[NSJSONSerialization dataWithJSONObject:dict NSJSONWritingPrettyPrinted error:nil];
查
id object=dict1[@"key"];
id object=[dict1 objectForKey:@"key"];
NSArray *allKeys=[dict1 allKeys];
NSArray *allValues=[dict1 allValues];
NSMutableDictionary
创建
NSMutableDictionary *dict5 = [[NSMutableDictionary alloc] init];
NSMutableDictionary *dict6 = [[NSMutableDictionary alloc] initWithDictionary:dict1];
NSMutableDictionary *dict7 = [[NSMutableDictionary alloc] initWithObjectsAndKeys:@"vA", @"kA",@"vB", @"kB",nil];
改
[dict4 setObject:@"" forKey:@""];
[dict4 removeObjectForKey:@""];
NSSet(几乎不用)
NSSet *set=[[NSSet alloc]initWithObjects:@“”,@“”,nil];
NSSet *set=[[NSSet setWithObjects:@“”,@“”,nil];
NSCharacterSet(用于分割字符串、中文编码)
// 分割字符串
NSCharacterSet *cSet=[NSCharacterSet characterSetWithCharactersInString:@“#$%”];
NSString *str=@“ddddd#fff%fff$dd”;
NSArray *arr=[str componentsSeperatedByCharactersInSet:cSet];
// url中文编码
NSCharacterSet *set2=[NSCharacterSet URLFragmentAllowedCharacterSet];
[str stringByAddingPercentEncodingWithAllowedCharacters:set2];
NSDate
// 根据时间戳(毫秒 /1000=秒)
NSDate *date=[[NSDate alloc]initWithTimeIntervalSince1970:time/1000];
// 格式类
NSDateFormatter *format=[NSDateFormatter new];
// 格式
[format setDateFormat:@"yyyy/MM/dd HH:mm:ss"]; // 自定义 HH为24小时制,hh为12小时制
// date转str
NSString *timeS=[format stringFromDate:date];
// str转date
NSDate *date = [format dateFromString:@"2010/09/09 13:14:56"];
// 获取当前时间
NSDate *date = [NSDate date];
// 当前时间5s后
NSDate *date = [NSDate dateWithTimeIntervalSinceNow:5];
// 从1970-1-1 00:00:00 开始1000s
NSDate *date=[[NSDate alloc]initWithTimeIntervalSince1970:1000];
// 从1970-1-1 00:00:00 的秒数
NSTimeInterval interval = [date timeIntervalSince1970];
// 返回旧 新
NSDate *firstDate=[date1 earlierDate:date2];
NSDate *lastDate=[date1 laterDate:date2];
// 2个date的时间差
NSTimeInterval interval=[date1 timeIntervalSinceDate date2];
// date1加秒数 得到date2
NSDate *date2 = [date1 dateByAddingTimeInterval:60];
根据字符串 返回星期几
/**
参数:时间字符串,格式
返回:@"星期几"
*/
+(NSString *)getWeekdayWithDateStr:(NSString *)dateStr withFormatStr:(NSString *)formatStr{
//
NSArray *weekdayArr=@[@"星期日",@"星期一",@"星期二",@"星期三",@"星期四",@"星期五",@"星期六"];
// 日历(NSCalendarIdentifierGregorian)
NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian];
// date
NSDateFormatter *dateFormat=[NSDateFormatter new];
[dateFormat setDateFormat:formatStr];
NSDate *date=[dateFormat dateFromString:dateStr];
// comps
NSDateComponents *comps=[calendar components:NSCalendarUnitWeekday fromDate:date];
return weekdayArr[[comps weekday]];
}
- 自定义类
使用Dog类
// 新建一个对象
Dog *dog=[[Dog alloc] init];
// 使用该对象的属性/方法
dog.dogName // 位于=左侧则是设置值(调用set方法) , 位于=右侧则是获取值(调用get方法)
[dog run];
自定义Dog类
// 接口.h文件(用于外部调用)
@interface Dog:NSObject{
NSString *_dogName; // 属性用{}与方法分开,不能在setDogName:方法中用self.(本质是调用setDogName:)造成循环调用,可以在其他方法中用self. , 但为了统一格式:统一用 _变量名(声明是 调用亦是)
}
-(void)run; // 实例方法
-(void)run:(int)count; // 实例方法(带参)
-(void)run:(int)count withLength:(int)length; // 实例方法(带多参)
+(int)Legs; // 类方法
@end
// 实现.m文件(具体实现)
@implementation Dog
static NSString *const kM = @"sb"; // static修饰全局变量时表示:只在本类内部使用 const修饰常量(const修饰“右边” const *kM 则表示指向不可变 内容可变 * const kM 则表示kM及内容不可变 *kM即指向可变)
-(void)run{}
-(void)run:(int)count{}
-(void)run:(int)count withLength:(int)length{}
+(int)Legs{
return 4;
}
@end
5. 关键字
nullable nonnull
只可以修饰类类型
nullable :可以为nil(默认)
nonnull :不可以为nil
属性
@property (nonatomic,strong,nonnull) NSArray *muArr;
@property (nonatomic,strong) NSArray * __nonnull muArra;
@property (nonatomic,strong) NSArray * _Nonnull muArray;
方法
-(void)func:(nonnull NSString *)str{}
-(void)funct:(NSString * _Nonnull)str{}
-(void)functi:(NSString *__nonnull)str{}
NS_ASSUME_NONNULL_BEGIN
NS_ASSUME_NONNULL_END
null_resettable
_Null_unspecified
__kindof
6. 泛型
@property (nonatomic,strong) NSMutableArray<NSString *> *muArr;
从数组中取出的元素可以直接使用其属性或方法
7. 协议delegate
1.协议
@protocol MyDelegate<NSObject>
@required
@optional
-(void)run;
@end
2. A类 dele属性
@property(nonatomic,weak) id<MyDelegate> delegate;
需要的地方 判断dele是否有方法后执行[self.dele 方法];
3. B类 遵守协议
B类名<协议>
实现协议方法
110. 其他小知识
@class 类名 // 声明有此类
.h中用@class声明要用到的其他类,.m中再#import "" (可减少编译时间)
self.属性: 会首先调用set/get方法 (兼容懒加载,统一格式)
_属性:会直接访问属性值
== 比较指针
instancetype:代表本类型(仅用于本类)
-(instancetype)init(){
self=[super init]
if(self){
}
return self
}
C:
[函数] 调用在实现之前,要进行声明
声明: 返回类型 函数名(参数类型 参数名);
实现: 返回类型 函数名(参数类型 参数名){}
调用: int x=函数名(参值);
所有数据类型要用()括起来
类型转换(强转)
(UIImageView*)view (NSNumber*)@"123"
浮点型+整型==浮点型(可直接操作,精度为最大的那个,当函数要求返回类型为低精度时直接转)
不支持函数重载(JAVA C++支持)
- typedef
typedef重定义数据类型---给类型取别名
// 用MyInt代替int(安全)
typedef int MyInt;
// 枚举(Type typeA)
typedef enum{
TypeA=0,
TypeB,
}Type;
// struct (MyPerson person)
typedef struct Person{
char *name;
int age;
}MyPerson;
// block (MyBlock myBlock)
typedef void (^MyBlock)(NSString *content);
// C函数
typede void (*MyMehod)(char *content)
// C数组
typedef int (*Arr)[10];
为复杂声明取别名
1.
举例:void (*xxx[10]) (void (*)());
解:typedef void (*VoidFun)();
typedef void (*Fun)(VoidFun);
答:Fun xxx[10];
2.
举例:doube(*)() (*xxx)[9];
解:typedef doube(*VoidFun)();
typedef VoidFun (*Point)[9];
答:Point xxx;
小记:[] 优先级高于*
注意:
1.
const int *a=10;
a++;
正确
typedef int* YTInt;
const YTInt a=3;
a++;
报错
原因:将YTInt整体作为数据类型,const直接修饰了a,导致a不可变,*a可变。
- "重载"
JAVA(C++同理)
public interface Person{
}
public class Student implements Person{
}
public class Adult implements Person{
}
public class Run{
public void read(Person person){
System.out.println("person read");
}
public void read(Student person){
System.out.println("Student read");
}
public void read(Adult person){
System.out.println("Adult read");
}
}
Person person=new Student();
Read readM=newRead();
readM.read(person);
会输出person read,不是想要的结果。直接作为参数放进去,不会识别,调用方法可识别(因此给person加一个方法---readM作为参数传入,在添加的方法中调用read方法),这样一来就先识别了类。
解决:
添加方法
public interface Person{
public void goRead(Read read);
}
public class Student implements Person{
public void read(Read read){
read.read(this);
}
}
public class Adult implements Person{
public void read(Read read){
read.read(this);
}
}
Person person=new Studnt();
Read read=newRead();
person.goRead(read);
OC不支持重载
// 利用SEL可实现“重载”
SEL selector = NSSelectorFromString(@"");
if ([self respondsToSelector:selector]) {
[self performSelector:selector withObject:@"参数对象"];
}
- main.m 程序主入口
// 包含系统基础库
#import <Foundation/Foundation.h>
// 主函数(程序入口)
int main(int argc, const char * argv[]) {
// 自动释放池(内存管理方式之一)
@autoreleasepool {
// 打印
NSLog(@"Hello, World!"); // ; 语句分隔符(所有语句)
NSLog(@"%@",@"字符串");
}
return 0;
}
#import <UIKit/UIKit.h>
#import "AppDelegate.h"
int main(int argc, char * argv[]) {
@autoreleasepool {
// 创建一个UIApplication对象,和AppDelegate对象(遵守<UIApplicationDelegate> )
// 第3个参数等价于:[UIApplication class](也可以是其子类) 第4个参数:遵守<UIApplicationDelegate> 的一个类
return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
}
}