Object-C
概述
-
面向对象语言
-
OC的h文件和m文件有什么区别以及作用?
h:头文件。头文件包含类,类型,函数和常数的声明。//因此就像是接口文件一般。
m:源代码文件。这是典型的源代码文件扩展名,可以包含Objective-C和C代码。//具体的实现文件就像C程序中的.h .c文件。
在.m文件中声明的变量是无法被外界看到的,属于私有属性,而.h文件中的属性属于public属性。
-
Object-c不支持多重继承;C++支持;
-
Object-c是动态语言
动态语言是指程序在运行时可以改变其结构,新的函数可以被引进,已有的函数可以被删除等在结构上的变化。
-
简单的界面文件MyClass.h:
@interface MyClass:NSObject{ //类变量声明 } //类属性声明 //类方法声明 @end
执行MyClass.m文件,如下:
@implementation MyClass
//类方法定义
@end
创建对象
MyClass *objectName = [[MyClass alloc]init];
*号代表对象;[]代表方法调用,只能通过类或者对象才能调用。先执行[MyClass alloc],相当于java的new 一个对象,之后调用init方法进行初始化。
方法
- (returnType)methonName:(typeName)variable1 :(typeName)variable2
数据类型
序号 | 数据类型 | 解释 |
---|---|---|
1 | NSString | 字符串 |
2 | CGfloat | 浮点值的基本类型 |
3 | NSInteger | 整型 |
4 | BOOL | 布尔型 值为YES/NO或者1/0 |
5 | id | 存放任意类型的对象,定义为指向对象的指针,类时java的Object |
6 | Nil/nil | nil相当于java的null,表示对象指针指向空;Nil是定义一个指向空的类而不是对象 |
7 | NSString | 不可变字符串;基础用法:创建/截取/遍历/比较/大小写转换/搜索 |
8 | NSMutableString | 可变字符串;基本写法是[[NSMutableString alloc]init] |
条件语句
//使用带括号这种,不要使用无扩号的。
if(!error){
return success;
}
不要使用尤达表达式:
- 尤达表达式:用一个常量去和表了比较而不是用变量和常量进行比较。
正确写法:if([myValue isEqual:@42]){...}
错误写法:if([@42 isEqual:myValue]){...}
空值
-
nil 用于对象
-
NULL 用于通用指针
-
NSNull 用于集合类
注意:在集合NSArray和NSDictionary中nil表示列表结束,所以不能在集合中放入nil。
不要嵌套条件语句
当编写条件语句的时候,左边的代码间距应该是一个“黄金”或者“快乐”的大道。这是说,不要嵌套if语句。多个return语句是OK的。这样可以避免Cyclomatic复杂性,并且让代码更加容易阅读。因为你的方法的重要的部分没有嵌套在分支上,你可以很清楚地找到相关的代码。
推荐写法:
- (void)someMethod {
if (![someOther boolValue]) {
return;
}
//Do something important
}
不推荐写法:
- (void)someMethod {
if ([someOther boolValue]) {
//Do something important
}
}
复杂的条件语句
当存在一个复杂的条件语句时,将它们提取出来并赋值给多个BOOL变量,这样更加清晰有效。
BOOL nameContainsSwift = [sessionName containsString:@"Swift"];
BOOL isCurrentYear = [sessionDateCompontents year] == 2014;
BOOL isSwiftSession = nameContainsSwift && isCurrentYear;
if (isSwiftSession) {
// Do something very cool
}
Case语句
switch (condition) {
case 1:
// ...
break;
case 2: {
// ...
// Multi-line example using braces
break;
}
case 3:
// ...
break;
default:
// ...
break;
}
- 在case中删除break,可以让下一个case继续执行。
switch语句中使用了一个可枚举变量时,default是可以省略的。
此外,为了避免使用默认的 case,如果新的值加入到 enum,程序员会马上收到一个 warning 通知 Enumeration value ‘ZOCEnumValue3’ not handled in switch.
Enumerated Types 枚举类型
当使用enum的时候,建议使用新的固定的基础类型定义,因它有更强大的的类型检查和代码补全.SDK 现在有一个 宏来鼓励和促进使用固定类型定义 - NS_ENUM()
typedef NS_ENUM(NSUInteger, ZOCMachineState) {
ZOCMachineStateNone,
ZOCMachineStateIdle,
ZOCMachineStateRunning,
ZOCMachineStatePaused
};
初始化
dealloc方法放在实现文件的最前面
@synthesize: @dunamic:
通常,在init方法中做的事情需要在dealloc中撤销。
init方法结构
- (instancetype)init
{
self = [super init]; //call the designated initializer
if(self){
Custom initialization
}
return self;
}
Designated和Secondary Initializers
designated初始化方法是提供所有参数,secondary初始化方法是一个或者多个,并且提供一个或者更堵默认参数来调用designated初始化方法的方法。
@implementation ZOCEvent
- (instancetype)initWitTitle:(NSString *)title
date:(NSDate *)date
location:(CLLocation *)location
{
self = [super init];
if(self){
_title = title;
_date = date;
_location = location;
}
return self;
}
- (instancetype)initWithTitle:(NSString *)title
date:(NSDate *)date
{
return [self initWithTitle:title date:date location:nil];
}
- (instancetype)initWithTitle:(NSString *)title
{
return [self initWithTitle:title date:[NSDate date] location:nil];
}
@end
定义一个新类的三种不同方式:
不需要重载任何初始化函数
重载designated initializer
定义一个新的designated initializer
属性
属性定义格式:
@property (nonatomic,readwrite,copy)NSString *name;
属性的参数应该按照 原子性->读写->内存管理的顺序排列。这样做属性更容易修改正确,并且更好阅读。
注意:除非特殊情况,否则必须使用nonatomic, 除非特别需要的情况。IOS中,atomic带来的锁特别影响性能。
未完待续
集合
注意:集合不能接受nil , nil 是作为集合结束标识符号。
NSArray (不可变)
类似java的ArrayList, 可以存储不同类型的对象,一般情况下数组元素的类型是相同的。
//字面量创建方式
NSArray *arr2 = @[@"aaa",@"bbbbb"];
//工厂方法创建
NSArray *array = [[NSArray alloc] initWithObjects:@"1", @"2", nil];
//取最后一个元素
[array lastObject];
// 取第一个元素
[array firstObject];
// 数组是否包含某个元素
[array containsObject:@"1"];
// 数组的大小
int count = (int) array.count;
// 第一种方式遍历
for (int i = 0; i < count; i++) {
NSString *_str = [array objectAtIndex:i];
}
// 字面量创建二维数组并访问
NSArray *arr2 = @[@[@11, @12, @13], @[@21, @22, @23], @[@31, @32, @33]];
// 字面量访问方式(推荐)
NSLog(@"arr2[2][2]:%@", arr2[2][2]);
// 数组对象函数访问
NSLog(@"arr2[2][2]:%@", [[arr2 objectAtIndex:2] objectAtIndex:2]);
NSMutableArray(可变的)
//增删改查:
//创建,当然还有其他方式
NSMutableArray *mutableArr = [NSMutableArray arrayWithObjects:@"one",@"two",@"three", nil];
//添加
[mutableArr addObject:@"hello"];
//替换
[mutableArr replaceObjectAtIndex:2 withObject:@"tihuan"];
//删除
[mutableArr removeObjectAtIndex:1];
//插入
[mutableArr insertObject:@"ios" atIndex:1];
未央书斋 温故知新