oc学习

1. 介绍:

  • Objective-C 简称OC /Obj-c
  • Objective 是面向对象的,OC是在C语言的基础上添加了一些新的面向对象的语法,比较繁琐的语法封装的更为简单,所以在学习Objective-C之前大家必须去学习C语言一些基本的语法之类。
  • 所以OC它是完全兼容C语言的,我们可以在任何的OC语言中写任意的C代码。

2. OC的第一个Hello World:

在Xcode中–File–》New–》Project–》选择Command Line Tool,创建第一个xcode工程。第一个Hello World程序创建完毕

// ------知识点1:Foundation框架中包含了很多开发中常用的数据类型
#import <Foundation/Foundation.h>

// ------知识点2:main函数仍然是程序的出入口      
int main(int argc, const char * argv[]) { 

	/*
	------知识点3: OC对象的生命周期取决于引用计数,我们有两种方式可以释放对象:一种是直接调用release释放;另一种是调用autorelease将对象加入自动释放池中。自动释放池用于存放那些需要在稍后某个时刻释放的对象。我们的Mac以及iOS系统会自动创建一些线程,例如主线程和GCD中的线程,都默认拥有自动释放池。每次执行 “事件循环”(event loop)时,就会将其清空,这一点非常重要,请务必牢记!因此我们一般不需要手动创建自动释放池,通常只有一个地方需要它,那就是在main()函数里。新增的自动释放池可以减少内存用量,因为系统会在块的末尾把这些对象回收掉。而上述这些临时对	象,正在回收之列。自动释放池的机制就像“栈”。系统创建好池之后,将其压入栈中,而清空自动释放池相当于将池从栈中弹出。在对象上执行自动释放操作,就等于将其放入位于栈顶的那个池。
	*/
	@autoreleasepool {					
		// insert code here...

		// ------知识点4: 使用NSLog()函数进行打印输出;@"   "表示一个字符串
        		NSLog(@"Hello, World!");
	}
	return 0;
}

上面例子中的用法介绍:

① #import

   #import指令是#include指令的增强版,能实现include的功能
   #import增强的点就是单独使用这个指令,不会造成重复包含,同一个文件中,无论被#import多少次,在预编译的时候只会包含一次。

② NSLog()、NSString、NS前缀介绍、@符号介绍:

NSLog():

  • C语言中的printf中的增强版
  • 作用:在控制台打印数据
  • 好处:打印清晰,不用输入\n,会自动换行

NSString():

  • OC中特意设置了NSString指针去储存字符串,使用NSString指针变量可以保存1个字符串数据的地址。
  • 注意:
       一、OC字符串必须以@开头
       二、@必须写在”“前面
       三、在OC中打印字符串使用%@
       四、 NSString只能储存字符串数据地址

③ NS前缀():

1. 前缀:
   在OC应用中所有的类名都必须是全局唯一的,由于很多不同的框架会有一些相似的功能,所有在名字上也会有重复的可能,所以苹果官方文档规定类名需要2-3个字母作为前缀。

2. 类前缀:
   苹果官方建议两个字母作为前缀的类名是为官方的库和框架准备的,而对于作为第三方开发者的我们,官方建议使用3个或者更多的字母作为前缀去命名我们的类。
   NS来自于NeXTStep 的一个软件 NeXT Software.OC中不支持命名空间,NS是为了避免命名冲突而给的前缀,看到NS前缀就是知道是Cocoa中的系统类的名称

④ @符号介绍:在OC中@符号有两种含义:
   @"": 代表OC语言中的一个字符串,例如:@“你好世界”
   @直接接英文:代表OC语言中的一个关键字,例如:@interface

3. OC的类的声明和实现:

① .h中的方法只是做一个声明,并不对方法进行实现。也就是说,只是说明一个方法名,方法的返回值类型、方法接受的参数类型,并不会编写方法内部的代码。

@interface class名 : 继承类名
// 声明的函数和属性
@end

② .m是类的实现文件。用于实现.h中声明的方法。类的实现使用关键字@

@implementation class名
// 函数实现
@end

③ 方法:方法的声明和实现,都必须以+或者-开头

+:表示类方法(静态方法) 
-:表示对象方法(动态方法)

无参数语法: - (返回值类型)方法名{方法体}
有参数语法: - (返回值类型)方法名:(参数类型)参数名称{方法体}
多个参数语法: - (返回值类型)方法名:(参数类型)参数名称 方法名:(参数类型)参数名称 方法名:(参数类型)参数名称{方法体}

示例:

//声明没有返回值的方法
- (void)method;
 
//声明有返回值的方法
- (int)method;
 
//声明有返回值有参数的方法
- (int)method: (int)var;
 
//声明有返回值有多个参数的方法
- (int)method: (int)var1 andVar2: (int)var2;

④ 方法的调用:

无参语法: [对象名 方法名];
有参语法: [对象名 方法名:实参];
多个参数语法: [对象名 方法名:实参 方法名:实参 方法名:实参];

//实例化一个对象
Person *person = [Person new];
//给对象的_name属性赋值
person -> _name = @"好玩";
//调用无参数的方法。有些屌丝也称:向person对象发送了一条sayHi消息
[person sayHi];
//调用一个参数的方法
[person eatWith:@"包子"];
//调用多个参数的方法
int result = [person getSumWithNum1:10 andNum2:20];
对象方法类方法
内容内容
属于对象属于类
声明以 - 号开头声明以 + 号开头
只能由对象调用,否则不可执行只能由类名调用,对象不行
可以访问实例变量(成员变量)不能直接访问实例变量(成员变量)
可以调用当前对象的对象方法不能直接调用对象方法。想要调用对象方法,必须创建或传入对象。
可以调用其他对象的对象方法
不可以调用类方法
执行效率低执行效率高

⑤ 成员变量:成员变量作用域有3中:

@public 全局都可以访问 
@protected 只能在类内部和子类访问 
@private 只能在类内部访问

// 举例
@interface 类名 : 父类名
{
@public
// 成员变量
}
// 成员变量必须写在{}里面,方法必须写在{}的外面 

(1)成员变量: 成员变量是定义在{}号中的变量。成员变量用于类内部,无需与外界接触的变量。
(2)实例变量: 如果成员变量的数据类型是一个类则称这个变量为实例变量。
   实例变量+基本数据类型变量=成员变量
(3)属性(或者叫属性变量): 属性变量是用于与其他对象交互的变量。有属性修饰符修饰属性,例如nonatomic。
   @property的作用:能够自动生成get和set方法的声明,
   定义方式:@property 成员变量类型 成员变量名(去掉下划线)

@interface MyViewController :UIViewControlle
{
	UIButton *yourButton;   // 成员变量,也是实例变量
	int count;    // 成员变量
	id data;    // 成员变量
}
@property (nonatomic, strong) UIButton *myButton;    // 属性(或者叫属性变量,有前缀 @property)
@end 

4. self:

含义:自己
本质:指针
位置:指针方法中

  • self在对象方法中,代表当前对象
  • self在类中,代表当前类

self访问成员的方法:

[self fun] // 访问成员函数
[self.nam] //访问成员变量

5. super:

1.用在对象的方法中:调用对象父类的对象方法
2.用在类方法中: 调用类的父类的类方法

6. id :

概述: 万能指针,能够指向任何OC对象 , id自带*。
id用法:
   ①作为参数
   ②作为成员变量

7. NSString:

初始化字符串:

[NSString stringWithFormat:@“%@%d”, name, count]; // 内存管理上是autorelease的,不用手动显式release
[[NSString alloc] stringWithFormat:@“%@%d”, name, count];  // 对象方法,必须手动release来释放内存资源

从文件或url中读取字符串:

// 从文件中读取字符串:
//使用NSError,首先定义一个NSError的指针变量,不用赋值
NSError *err;
NSString *fileStr=[[NSString alloc]initWithContentsOfFile:@“xxx文件” encoding:NSUTF8StringEncoding error:&err];
//如果err为空,err=null,即0,则正确
if (!err) {
 // NSLog(@"%@",fileStr);
}

// 从url中读取:
NSError *urlErr;
NSURL *url=[[NSURL alloc] initWithString:@"http://www.baidu.com"];
NSString *urlStr=[[NSString alloc] initWithContentsOfURL:url encoding:NSUTF8StringEncoding error:&urlErr];

遍历查找字符串:

NSString *strTest=@“hello”;
 for (int i=0; i<[strTest length]; i++) { // length为获取字符串的长度
       char ch=[strTest characterAtIndex:i];
}

[[NSString alloc] getCharacters:strTest range:NSMakeRange(0, 2)]; // 获取字符串strTest从0开始,2个长度的子字符串。
// NSMakeRange(<#NSUInteger loc#>, <#NSUInteger len#>)

[strTest containsString:@“he”]; // 判读字符串中是否包含he,如果是返回true

NSRange range = [strTest rangeOfString:@“l” options:NSBackwardsSearch]; // 找到l的位置,并且选择什么方式NSBackwardsSearch

比较字符串:

BOOL isequal=[equalStr isEqualToString:equalStr2]; // 如果相等,返回的是true

BOOL compare=[equalStr compare:equalStr2]; //  如果第一个大于第二个,返回1;小于返回-1.相等返回0

[equalStr hasPrefix:@“he”] // 判断字符串前缀是否有he

[equalStr hasSuffix:@“he”] // 判断字符串后缀是否有he

拼接字符串:

[strTest stringByAppendingFormat:@“%@%@”, @“/”, @“test”];  //可以同时拼接多个

[strTest stringByAppendingFormat:@“test”];

字符串转为大小写:

[strTest lowercaseString]; // 全部转为小写
[strTest uppercaseString]; // 全部转为大写
[strTest capitalizedString]; //首字母大写

划分字符串:

NSArray* tempstrs = [strTest componentsSeparatedByString:@" - "]; // 如果字符串strTest中有-,根据-位置,划分为几个组

NSString* strTest = [strTest substringFromIndex:[strTest rangeOfString:@" "].location]; // 找到空格的位置。
substringFromIndex:
substringWithRange:
substringToIndex:

替换字符串:

bSymbolName = [strTest stringByReplacingOccurrencesOfString:@"/" withString:@"-"]; // 把/替换为-

字符串转为其他类型:

[sketchVersion intValue]; //返回的是int类型的
[sketchVersion boolValue]; //返回的是bool类型的

8. NSArray, NSMutableArray:

NSArray和NSMutableArray互相转换

// NSArray --> NSMutableArray
NSMutableArray *myMutableArray = [myArray mutableCopy];

// NSMutableArray --> NSArray
NSArray *myArray = [myMutableArray copy];

初始化:

// NSArray
NSArray *array=[[NSArray alloc] init];    //NSArray是不可变数组,一但创建完成就不能对数据进行添加、删除等操作

NSArray *arr=[NSArray arrayWithObjects:@"one",@"two",nil];//通过构造方法创建一个NSArray,在创建一个NSArray的时候最后一个元素一定是nil

NSNumber *number=[NSNumber numberWithInt:10];
NSArray *arr2=[NSArray arrayWithObjects:@"three",@"four",number,nil]; // 数组中可以储存不同类型的元素,如果要在数组中存储基本数据类型,必须包装成NSNumber在去存

NSArray *arr8=@[@"a",@"b",@"c"]; //创建数组的快捷方式:不用写nil结尾

// NSMutableArray
NSMutableArray * arr = [NSMutableArray array];

NSMutableArray * array =[[NSMutableArray alloc] initWithObjects:@"a",@"b",@"c" ,nil];

NSMutableArray * array1 =[NSMutableArray arrayWithObjects:@"a",@"b",@"c" , nil];

NSArray * array2 = @[@"1",@"2",@"3"];
NSMutableArray * array3 = [[NSMutableArray alloc]initWithArray:array2];

索引:

// 1. 数组中是否包含某对象:containsObject
NSArray* arr = [[NSArray alloc] initWithObjects:@"test1", @"test2", nil]; 
if([arr containsObject:@“test1”])  // 判断数组中是否有“test1”,NSMutableArray也是同样的方法

// 2. 遍历:count, objectAtIndex
for (int i=0; i < [arr count]; i++) {
        id obj = [obj objectAtIndex:i];
}

// 3. 某个对象在数组中的位置indexOfObject
NSArray* typeName = [NSArray arrayWithObjects:@"test1",@"test2",@"test3",nil];
int typeNameIndex = (int)[typeName indexOfObject:@"test2"]; //NSMutableArray也是同样的方法

插入,删除,添加:insertObject,removeObjectAtIndex/removeAllObjects,addObject

NSMutableArray* arr = [NSMutableArray array];
[arr insertObject:@"test0" atIndex:i];//在第i个位置插入
[arr removeObjectAtIndex:i];//删除第i个元素
[arr removeAllObjects]; // 删除所有元素
[arr addObject:@"test1"];

替换:replaceObjectAtIndex

[arr replaceObjectAtIndex:i withObject:@"test"]; // 在第I个位置用字符串@"test”替换

9. NSDictionary, NSMutableDictionary:

可变字典继承自不可变字典。
NSDictionary转换NSMutableDictionary: dictionaryWithDictionary

NSDictionary *dic = [NSDictionary dictionaryWithObject:@"123" forKey:@"key"];
NSMutableDictionary * mdic = [NSMutableDictionary dictionaryWithDictionary:dic];

初始化:

// NSDictionary 不可变字典
NSDictionary *dic1 = [NSDictionary dictionaryWithObject:@"@123" forKey:@"key1"];
NSDictionary *dic2 = [NSDictionary dictionaryWithObjectsAndKeys:@"value1",@"key1",@"value2",@"key2" ,nil];
NSDictionary *dic3 = [NSDictionary dictionaryWithDictionary:dic1];
NSDictionary *dic4 = @{@"key1": someValue, @"key2": @"value2"};
NSString * path = @"路径";
NSDictionary *dic5 = [NSDictionary dictionaryWithContentsOfFile:path];

// NSMutableDictionary 可变字典
NSMutableDictionary * mdic = [NSMutableDictionary dictionary];

获取字典信息:

// 返回字典键值对的个数
NSInteger count=[dict count]; 

// 通过key获取对应的value对象
NSObject *object = [dic objectForKey:@"key1"];
[dic valueForKey:@"key1"]

// 获取所有键的集合
NSArray *keys = [dic allKeys];

//获取所有值的集合
NSArray *values = [dic allValues];

添加,删除(只针对可变字典)

// 向字典中追加一个新的 key 和 value
[dic setObject:@"value" forKey:@"key"];

// 向字典中添加整个字典对象
[dic addEntriesFromDictionary:dic]; // 注意,如果dic为空,则添加不进去

// 将字典2的对象内容设置与字典1的对象内容相同
[dic2 setDictionary:dic1];

// 删除键所对应的键值对
[dic removeObjectForKey:@"key"];

//删除数组中的所有key 对应的键值对
NSArray *array = @[@"key1",@"key2",@"key3"];
[dic removeObjectsForKeys:array];

//移除字典中的所有对象
[dic removeAllObjects];

遍历

NSArray *keys = [dic allKeys];
for (int i = 0; i < [dic count]; i++) {            
            id key = [keys objectAtIndex:i];
            id obj = [dic objectForKey:key];
}
// 快速遍历       
for (id key in dic) {            
        id obj = [dic objectForKey:key];
}

// 枚举的办法遍历
NSEnumerator *enumerator = [dic keyEnumerator];
id key = [enumerator nextObject];
while (key) {
       id obj = [dic objectForKey:key];
       key = [enumerator nextObject];
}

10. NSFileManager:

// 初始化
NSFileManager * fileManger = [NSFileManager defaultManager];

// 获取子路径
NSArray *allPath =[fileManger subpathsAtPath:path];

// 判断文件是否存在
if(![fileManger fileExistsAtPath:filepath])

更多详细接口在Xcode中Help–》Developer Documentation 搜索

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值