OC入门

OC入门_第1张图片
Format:样式,格式(1、将非(NSString*)类型的变量转化成(NSString*)类型  2、打印字符串需要添加※号或斜杠这种字符)

uppercase:大写

lowercase:小写

capitalized:首字母大写

character:字符,符号

Index:索引

exchangeObject:数组中元素位置交换

UTF8String:二进制与OC转化

description:描述

sub:提取

default:单例

alloc:分配空间

Directory:文件夹

Item: 文件

file:文件

data:数据

encoding:编译编码

48~57  对应数字  1~9

65~90  对应字母   A~Z

97~122 对应字母 a~z

空指针:NULL

空变量:nil

[NSString stringWithString:str]:类方法

继承:父类具有的属性及方法子类直接获得,称为继承。

派生:子类从父类的基础上衍生出的新的属性及方法,称为派生

代码编写

①重写父类方法,不需要在.h里重复声明,在.m直接调用即可

②在真正的开发中,更需要保留父类的方法,在父类方法的基础上添加新的功能。在新功能前添加[super方法名];

③衍生出新的方法及属性

[superrun]:super表示父类所创建的对象

[selfswim]: self表示一个属于所处类的具体对象

Father* father1 = [Sonalloc]:father1只是一个指针,[Sonalloc]才是真正从内存中创建得用于存放成员变量的对象

[father1run]:father1这个指针所指的对象终究属于为她开辟空间的类,而不是创建她的类

变量的出生两种方式1、变量类型声明 2、属性定义    前者出生的变量值无法在外函数使用,而后者可以,但无法在子类中使用

SELsel =@selector(crash)/(crashWithPeople:)/(setArg:):将《crash无参数的方法》或《crashWithPeople:有参数的方法》或《有多个参数的方式》存入刚声明的sel选择器中

[blackManrespondsToSelector:sel] == YES:判断对象是否具备选择器中的方法

[blackManperformSelector:sel]:对象执行选择器中的无参数的方法

[blackManperformSelector:selwithObject:@"kaka”]:对象执行选择器中的输入参数为kaka的方法

如果只有输入一个参数的入口而实际情况需要输入多个参数,那么这个参数可以是一个对象,每一个成员变量包含一个参数,用函数方法将每个参数的值赋给相应的成员变量,然后在这个多参数转换成单参数,只不过这个参数是对象而不是具体的字符串。说白了,就是先把本该直接赋给方法的多个参数的值先用对象初始化的方式进行接收,再通过以对象为参数的单参数方法里调用赋值函数将对象里成员变量接收到的值赋给需要的多个参数。通过对象传递多参数

问题在于如何把对象的成员变量值传递到每一个参数上得赋值函数:

- (void)setName:(NSString*)name AndPhoneNumber:(int)phoneNumber AndAge:(int)age

{

_name= name;

_phoneNumber= phoneNumber;

_age= age;

}

存入选择器中的方法也可以后期从终端进行输入:

c语言接收方法名字符串—>字符串 C转OC(UTF)—>存入选择器—>判断调用

SELsel2 =NSSelectorFromString(str);

父类里的成员变量以属性的形式声明,就得用self的方法才能在子类中调用,同时父类中一定会有构造方法对成员变量进行初始化。

APP中对输入的字符串进行判断、转换和提取?

BOOLret = [str1isEqualToString:str2];

NSComparisonResultret = [str1compare:str2];

NSComparisonResultret = [str1caseInsensitiveCompare:str2]; (注意:这里字符串不区分大小写,验证码就这种)

[strhasPrefix:前缀]

[strhasSuffix:后缀]

[strintValue/floatValue/integerValue]:字符串转换成整型、浮点型、无符号长整型

NSString* str = [NSStringstringWithFormat:@"%d",a]其它类型转到字符串,尤其适用于九九乘法表

NSNumber * intNumber = [NSNumber numberWithInt:10];

NSNumber * floatNumber = [NSNumber numberWithFloat:3.14];

[@8isEqualToNumber:@4]

[@6compare:@4.5]

NSString* str = [[NSStringalloc]initWithUTF8String:arr];C语言字符串转OC字符串

constchar* p = [str UTF8String]  OC字符串转C字符串

NSComparisonResultret = [str1compare:str2]字符串1减去字符串2

NSRangerange = [str1rangeOfString:@“确定字符”]:获取确定单词在字符串中的起始位置和终止位置

NSRangerange = NSMakeRange(range.location,range.length)

NSRange  Range = {range.location,range.length};

APP中对汉字串中的某个特定汉字进行提取?

NSRangerange = {i,1};

NSString* str = [arabicsubstringWithRange:range];

char  a= [strcharacterAtIndex:i]

APP中对字符串进行编辑?

setString

appendString(仅限字符串)、appendFormat(多类型)

componentsSeparatedByString:@“分隔符”

NSCharacterSet* set = [NSCharacterSetcharacterSetWithCharactersInString:@“多个分隔符,无需逗号隔开”]

[strcomponentsSeparatedByCharactersInSet:set]

[arraycomponentsJoinedByString:@“连接符”]

replaceCharactersInRange:rangewithString

insertString

deleteCharactersInRange:range

NSString* str2 = [str1 stringByAppendingString:@“”]:不可变字符串增加字符串

APP中对数组进行操作?

exchangeObject: 交换数组元素位置

[[NSArrayalloc]initWithObjects:@"abc",@"def",nil]:数组初始化赋值

for(idobjectinarray):数组对象遍历

[objectisKindOfClass:[SeaRobberclass]] ==YES :判断数组中的对象到底属于哪一类

NSMutableArray* array3 = [[NSMutableArrayalloc]initWithArray:array]:将不可变数组转化成可变数组

removeObject:@“”删除空字符

addObject增加对象

replaceObjectAtIndex:0withObject:@"小丽”: 替换对象

insertObject:@"老王"atIndex:1:  插入对象

exchangeObjectAtIndex:0withObjectAtIndex:1:改变对象

APP中用字典开发通讯录?

NSDictionary* dict =[[NSDictionaryalloc]initWithObjects:@[@"",@""]forKeys:@[@"",@""]];

NSMutableDictionary* dict = [[NSMutableDictionaryalloc]initWithObjects:@[@"",@"",@""]forKeys:@[@"",@"",@""]];

NSDictionary* dict =@{@"6":@"six",@"7":@"seven"};

allValues/allKeys:找到字典的所有值或键

setObject:@""forKey:@"81”:增加/修改

setDictionary:@{@"1":@"One”}]:字典重置

removeObjectForKey:@"41”:删除字典中键为41的数组

removeAllObjects:删除所有名片(清空)

通讯录类存名片数量:[dict count]

APP中“菜单”按钮用SEL选择器实现?

SELsel =@selector(crash)无参数或单双参数的方法直接存入(带参数的方法后面必须有冒号)

SELsel =@selector(setArg:)创建Arg类的对象和setArg:(Arg*)arg赋值给对象的函数,冒号不能少

[对象respondsToSelector:sel2]判断

[对象performSelector:sel]执行

[对象performSelector:selwithObject:@“参数”]带参执行

- (void)setName:(NSString*)name AndPhoneNumber:(int)phoneNumber AndAge:(int)age{

_name= name;

_phoneNumber= phoneNumber;

_age= age;

}

- (void)setArg:(Arg*)arg{

[selfsetName:arg.nameAndPhoneNumber:arg.phoneNumberAndAge:arg.age];

NSLog(@"%@%d%d",arg.name,arg.phoneNumber,arg.age);

}

从终端输入方法名字符串的情况

charbuf[10] = {};

scanf("%s",buf);

NSString* str = [[NSStringalloc]initWithUTF8String:buf];

SELsel2 =NSSelectorFromString(str);

APP通过“继承”为调用的官方或第三方类添加更适合当前项目的方法和属性?

APP中提取网络时间?

NSDate:时间类(创建的对象就是时间,返回时间的格式)

[NSDatedate]

NStimeInterval:时间变量类(创建的对象是sec-秒)

[datetimeIntervalSinceNow]:返回date时间距离现在多少秒

[现在timeIntervalSinceDate:出生]:返回现在我已近活了多少秒

NSTimeZone:时间时区类

NSTimeZone* timeZone = [NSTimeZonesystemTimeZone]:当前系统时区

NSDictionary* dict = [NSTimeZoneabbreviationDictionary]:字典存入所有时区

NSDateFormatter:时间戳类,可以通过它改变返回的时间的格式

NSDateFormatter* formatter = [[NSDateFormatteralloc]init];

formatter.dateFormat=@"yyyy年MM月dd日HH时mm分ss.S秒";

formatter.timeZone= [NSTimeZonetimeZoneWithAbbreviation:@"HKT"];

NSDate* date = [NSDatedate];//获得当前时间

NSLog(@"%@",[formatterstringFromDate:date]);

APP设置闹钟?

NSTimer:定时器类

NSDate* endDate = [NSDatedateWithTimeIntervalSinceNow:3600]:闹钟设在3600秒后

NSData创建的对象默认的格式是:@"2015-06-12 08:55:25 +0000"

现在的时间与设定的时间进行比较:

if(date.timeIntervalSinceReferenceDate> endDate.timeIntervalSinceReferenceDate)

sleep(1);在While的循环里每隔多少秒循环判断一次

APP显示文件夹里的内容路径?

NSFileManager:文件管理类

[NSFileManagerdefaultManager]:对象初始化

contents:只查找指定路径下面的一层文件路径

subpaths:查找指定路径的下层所有文件路径

hasSuffix:有后缀

hasPrefix:有前缀

APP中做文件的缓存,就像微博,在无网络的情况都能刷出已近刷出来得内容?

1、新建文件?

NSFileManager:文件管理类

[NSFileManagerdefaultManager]:对象初始化

fileExists:判断文件是否存在

createFile:创建文件(路径,内容,属性)

attributesOfItem:获取文件属性(用字典接收)

dict[@"NSFileSize”]:文件大小

2、文件编辑?

NSFileManager:文件管理类

[NSFileManagerdefaultManager]:对象初始化

moveItem/removeItem/copyItem

3、文件读写?

NSFileHandle:文件句柄类

[NSFileHandlefileHandleForReadingAtPath:路径]:对象初始化

NSData:数据类

NSString:字符串类

Data encoding:数据转字符串

dataUsingEncoding:字符串转数据

NSUTF8StringEncoding:二进制与OC

readDataOfLength:阅读指定长度的字节数据

seekToFileOffset:指定位置读取字节

synchronizeFile:文件立即同步

APP中存储固定数据?(存储的plist文件是什么结构就用什么类)

1、官方类创建的对象(plist)(自定义类型的数据无法存储,通常存储长时间不变的数据)

NSDictionary:字典类(字典键对应的值可以是数组名)

writeToFile(路径字符串)atomically:YES生成plist文件

dictionaryWithContentsOfFile:解析plist文件

new file—>resource—>property list以程序的方法进行设置

2、自定义类创建的对象(归档)

[NSKeyedArchiver archiveRootObject:指针toFile:路径]:对象归档

[NSKeyedUnarchiverunarchiveObjectWithFile:路径]:对象解档,档里是啥类型,就用什么类型创建的对象进行接收,且在等号后加一个(类名*)避免出错

NSObject//遵守归档的协议

//归档自定义对象时调用

-(void)encodeWithCoder:(NSCoder*)aCoder

{

[aCoderencodeInt:self.ageforKey:@"AGE"];

[aCoderencodeObject:self.nameforKey:@"NAME"];

}

//解档自定义对象时调用

-(instancetype)initWithCoder:(NSCoder*)aDecoder{

if(self= [superinit])

{

self.age= [aDecoderdecodeIntForKey:@"AGE"];

self.name= [aDecoderdecodeObjectForKey:@"NAME"];

}

returnself;

}


APP中的账号和密码存储及不同界面传值?

NSUserDefaults:用户单例类

[NSUserDefaultsstandardUserDefaults]:对象初始化

setObject:值forKey:键  :增加键和值

synchronize:及时同步

objectForKey:键  :取键对应的值,用字符串对象接收

removeObjectForKey:键  :删除键和键对应的值

APP通过Json格式与服务器端进行数据交换?

1、本地File路径

//宏定义JSON文件路径位置

#define  PATH @“路径”

//Json文件转化成字符串

NSString* str = [NSStringstringWithContentsOfFile:PATHencoding:NSUTF8StringEncodingerror:&error];

//字符串放入缓冲区转换成二进制数据

NSData* data = [strdataUsingEncoding:NSUTF8StringEncoding];

2、网络URL网址

//宏定义JSON网络路径位置

#define URL @“网址”

//将网络URL字符串转换为可识别的网址的格式

NSURL* url = [NSURLURLWithString:URL];

//Json文件转化成字符串(本地是File路径  网络是URL网址)

NSString* str = [NSString stringWithContentsOfURL:urlencoding:NSUTF8StringEncoding error:nil];

3、对容器的内容进行特定提取(遇到数组就接收,遇到字典就遍历)

字典接受Json所有内容

NSDictionary* dict = [NSJSONSerializationJSONObjectWithData:dataoptions:NSJSONReadingMutableContainerserror:nil];

数组接受字典里的数组值

NSArray* Array = Dict[@“键”]

遍历数组里的每一个字典

for(NSDictionary* Dictin Array)

model对象接收字典里所有不止一个键的值(model对象的初始化必须放在数组的字典遍历里,否则自动覆盖已存入信息)

[model setValuesForKeysWithDictionary:字典创建的对象名]://使用它必须model对象的成员名==键的名字

APP中输入四川省弹出四川所有城市名?

输入汉字并转化成OC的字符串

chararr[123] = {};

scanf(“%s”,arr);

NSString* str1 = [[NSStringalloc]initWithUTF8String:arr];

汉字是否相等的比较

[str1compare: dict1[@"省"]] ==0 //在元素全是字典的数组遍历时,拿字符串与字典特定键对应值相比较

([array[i]isEqualToString:str1] ==YES)//先将要比较的字符串通过遍历的方式加到一个数组,for循环数组逐个与从终端输入的字符串进行比较

APP中通过XML格式与服务器进行数据交换?

1、Xcode里添加GData文件才能解析XML数据

①将路径/usr/include/libxml2添加到工程的头文件中

Target->build Settings->search->search paths->header search paths ->点击加号添加路径

②GData运行在手动内存管理下,因为整体工程运行在自动内存管理下,所以需要为GData库添加内存管理混编。

Target->build phase- >complie sources->添加-fno-objc-arc

③GData是用libxml这个系统库,但该系统库没有包含在Foundation库下,所以需要手动添加系统库。

Target->build phase->Link binary with Libraries->添加libxml2.dylib

2、1 用XML解析(绝对路径,从头到尾)

//XML数据转换成字符串

NSString*  xml = [NSStringstringWithContentsOfFile:PATHencoding:NSUTF8StringEncodingerror:nil];

GDataXMLDocument* document = [[GDataXMLDocumentalloc]initWithXMLString:xmloptions:0error:nil];

//逐步进行解析

根元素:GDataXMLElement* rootEle = [documentrootElement];

子元素:GDataXMLElement* booksEle = (GDataXMLElement*)[rootElechildAtIndex:0];

子元素本质就是一个包含多个孩子的数组集合:NSArray* booksArray = [booksElechildren];

遍历每一个孩子时,需要先用GDataXMLElement创建一个对象才能接收

遍历:for(GDataXMLElement* bookEleinbooksArray)

初始化化孩子为对象:GDataXMLElement* summaryEle = [[bookEleelementsForName:@"summary"]firstObject];

2、2用XPATH进行解析(相对路径)

NSArray* array = [documentnodesForXPath:@"//book[限制条件]/name|//book[限制条件]/summary"error:nil];

限制条件包括:ID号、last()、position(<3)、@ID=2、@price

for(GDataXMLElement* eleinarray)NSLog(@"%@",ele.stringValue)

注意:有一种XML文件加密了,叫带有命名空间的XML文件

NSDictionary* dict =@{@“键”:@“值”,@“键”:@“值”};//注意:字典添加键值对是大括号,而数组添加对象则是中括号

NSArray* array = [documentnodesForXPath:@"绝对路径"namespaces:@"命名空间的字典"error:nil];

注意:@"xmlns:root/xmlns:books/xmlns:book/book:name”才是绝对路径,而非@"/root/books/book:name"

APP开发过程中考虑属性的线程安全问题?

@property()是一个属性访问声明,扩号内支持以下几个属性:

1、getter=getterName,setter=setterName,设置setter与getter的方法名

2、readwrite,readonly,设置可供访问级别

3、nonatomic,非原子性访问,不加同步,多线程并发访问会提高性能。注意,如果不加此属性,则默认是两个访问方法都为原子型事务访问。锁被加到所属对象实例级

4、atomic原子修饰符,表示线程安全

APP中使用单例的操作?

1、创建一个普通类和一个类方法

2、对类创建的对象以类方法的形式进行初始化

3、类方法就是staticSingleClass* single;//static表示内存为这个类创建的对象从始至终只分配一次空间

if(single ==nil) single = [[SingleClassalloc]init];

returnsingle;

4、main函数里类创建的对象=[类名用来初始化的类方法];

单例对象地址都是静态,所以其实就一个内存地址

App中实现类别:为官方类添加方法补丁?

也就是在新出现的头文件和 . m文件中分别一种类封装的形式进行处理!头文件写方法名,.m文件写实现!类别里可以直接使用官方类的方法和属性变量,而且添加了类别

OC中有多继承么?如果没有该怎么实现?(协议代理虚拟实现)

App中做一个动画?

过去:

1、开启动画

2、设置属性

3、动画结构

现在:

直接调用一个封装好的Block,界面时体会更深

App视频播放缓冲界面的制作?(block的传值与回调)

1、在视频播放器类里添加视频播放方法,方法实现写入内容为输出"下载已完成"的Block;

2、在下载器的类里添加下载的方法,只是这个方法的定义涉及到Block的传值;(类型+Block名)输入输出地类型都写,中间用(^)隔开;

-(void)downLoadWithBlock:(void(^)(NSString*))videoBlock;

3、在下载器的方法实现里在下载完成后使用Block;

4、在播放器的实现方法中创建一个下载器的对象调用下载器里的方法(去类型,留块名);

5、通过Block的参数可以把一个类里地值传到里一个类里。界面传值本质就是传参数;

在ARC自动内存管理的情况下再通过少量代码增加MRC手动内存管理,手机运行App时尽可能减少内存的使用?避免浪费用户的机器资源?

内存管理本质:管理对象的引用计数(指向对象空间地址的个数)

内存泄露:内存空间使用完毕之后未回收

release和dealloc的区别?

无直接关系,只是对引用计数进行减一操作

dealloc才是真正释放内存(当引用计数器为0时自动调用)

面向对象的本质在于,对许多对象提取出共性放在一起处理。这样,各式容器的使用就是无可避免的了

将一个具体的类有手动内存管理转化成自动内存管理?(删除可以删的所有release手动释放代码)

Edit—>Refactor—>convert ··ARC—>选择类

copy常用于修饰字符串(NSString)通常其他对象使用retain进行修饰符

strong与retain用法相同在MRC下通常使用retain修饰属性,而在ARC下通常使用strong修饰属性

类方法创建对象:NSString * str = [[NSString alloc]init];对象是被系统自动归到自动释池下管理(典型的标志就是没有alloc)

实例创建的对象:NSString * str = [NSString StringWithString:@"Carden"];如果在手动内存管理模式下,需要用release方法进行释放

在@implementation下声明的变量是这个类的私有变量,外部是无法访问的

在@interface下声明的变量可以设定为全局或者私有变量

在@property声明的就是全局变量,外部既可以访问,内部也可以调用

多态:子类重写父类方法,然后用父类引用指向子类对象,调用方法时候会进行动态绑定,这就是多态。多态对程序的扩展具有非常大的作用,如果有配置文件甚至可以不动源码。

Father* father1 = [Sonalloc];//父类的指针可以指向子类的对象

[father1run];//执行方法,不看指针,而是看对象是通过哪个类来开辟空间创建

协议与Block的比较?

协议本质:

1类方法里创建协议和实现2类方法的协议属性;2类添加协议所在的头文件和<协议名称>;

创建1类对象,创建2类对象,把2类对象赋值给1类属性,1类对象执行方法

Block本质:

1类方法里创建块方法和实现2类方法的2类对象;2类方法的参数为块类型,满足条件后执行块方法;

创建1类对象,1类对象执行方法

传值本质:

方法1包含方法2,方法1的的参数变量直接写成方法2的输入参数,只要方法调用方法就可以做到。

传值始终:

协议的初始值出现在主动类的方法里,Block的初始值出现在包含Block类型的方法里。

- (void)button:(BOOL)state AndBlock:(void(^)(BOOL))block;

协议作用:

协议可以让类1和类2甚至类3等完全不同的类各自创建的对象使用同一个方法,而且可以有参数,因为id类型不论什么类创建的对象都可以接受,也就是说,字符串创建的对象和数组和字典创建的对象都可以接收

//Document:存放长期要用的文件

//library:存放系统文件

//tmp:存储临时文件,APP重启时,该目录下的文件清空

NSLog(@"文件大小:%@",dict[@"NSFileSize"]);

NSFileManager * manager = [NSFileManager defaultManager];

(对象)[文件管理器创建的单例contentsOfDirectoryAtPath(数组)/subpathsOfDirectoryAtPath(数组)/attributesOfItemAtPath(字典)]

(布尔值)[文件管理器创建的单例fileExistsAtPath/createFileAtPath/copyItemAtPath/moveItemAtPath/removeItemAtPath]

文件句柄:指定已知路径下文件的操作权限(只读/只写/读写)

NSFileHandle * fileHandele = [NSFileHandle fileHandleForReadingAtPath/fileHandleForWritingAtPath/fileHandleForUpdatingAtPath]

[文件句柄创建的对象readDataOfLength(数据)/seekToFileOffset(void)/seekToEndOfFile(void)/writeData:data(void)/synchronizeFile(void)]

NSString * str = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];//数据转字符串

NSData * data = [str dataUsingEncoding:NSUTF8StringEncoding];//字符串转数据

[已存放内容的官方类型指针writeToFile:文件路径及文件名]  .Plist文件的生成

[NSDictionary dictionaryWithContentsOfFile(内容官方类型)]  .Plist文件的读取

[NSKeyedArchiver archiveRootObject(布尔值)/unarchiveObjectWithFile(内容类型)]  .data文件的生成和读取

基类NSObject后添加归档协议

-(void)encodeWithCoder:(NSCoder *)aCoder

{

[aCoder (encodeInt/encodeObject):self.属性(void)];

}//归档-自定义的.m文件添加

-(instancetype)initWithCoder:(NSCoder *)aDecoder{

if(self= [superinit])

{

self.age = [aDecoder decodeIntForKey:@"AGE"];

}

returnself;

}//解档-自定义的.m文件添加

NSUserDefaults * userDefaults = [NSUserDefaults standardUserDefaults];//存储用户个人登录信息的单例对象初始化

[用户单例创建的对象setObject(void)/objectForKey(字符串)/removeObjectForKey(void)]//增加、提取、删除

/*

#import "GDataXMLNode.h"

#define PATH   @"/Users/qianfeng/Desktop/1518OC第10天/xml/xml.txt"

NSString * xml = [NSString stringWithContentsOfFile:PATH encoding:NSUTF8StringEncoding error:nil];

GDataXMLDocument * document = [[GDataXMLDocument alloc]initWithXMLString:xml options:0 error:nil];

NSArray* array = [documentnodesForXPath:@"//ComeChannel/BuyCarBudget"error:nil];

for(GDataXMLElement* eleinarray)

{

NSLog(@"%@",[[ele addAttribute:for@"name"]stringValue]);

}

GDataXMLElement * rootEle = [document rootElement];

GDataXMLElement * booksEle = (GDataXMLElement*)[rootEle childAtIndex:0];

NSArray * booksArray = [booksEle children];

for (GDataXMLElement * bookEle in booksArray)

{

GDataXMLElement * summaryEle = [[bookEle elementsForName:@"summary"]firstObject];

NSLog(@"%@",summaryEle.name);

NSLog(@"%@",summaryEle.stringValue);

NSLog(@"%@",summaryEle.XMLString);

}

NSDictionary* dict =@[@"book":@"http://www.baidu.com",@"xmlns":@"http://www.sina.com.cn"];

NSArray* array = [document nodesForXPath: namespaces:dict error:nil];

*/

1.判断字符串中提取的字符类型?(中文,字母)

2.可变数组添加的ID为什么不能是NSInteger?

-(NSString*)description{

return[NSString stringWithFormat:@"count = %d   index = %ld",count,(long)indx];

}

你可能感兴趣的:(OC入门)