OC学习笔记一

Object-C

概述

  1. 面向对象语言

  2. OC的h文件和m文件有什么区别以及作用?

    h:头文件。头文件包含类,类型,函数和常数的声明。//因此就像是接口文件一般。

    m:源代码文件。这是典型的源代码文件扩展名,可以包含Objective-C和C代码。//具体的实现文件就像C程序中的.h .c文件。

    在.m文件中声明的变量是无法被外界看到的,属于私有属性,而.h文件中的属性属于public属性。

  3. Object-c不支持多重继承;C++支持;

  4. Object-c是动态语言

    动态语言是指程序在运行时可以改变其结构,新的函数可以被引进,已有的函数可以被删除等在结构上的变化。

  5. 简单的界面文件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

数据类型

序号数据类型解释
1NSString字符串
2CGfloat浮点值的基本类型
3NSInteger整型
4BOOL布尔型 值为YES/NO或者1/0
5id存放任意类型的对象,定义为指向对象的指针,类时java的Object
6Nil/nilnil相当于java的null,表示对象指针指向空;Nil是定义一个指向空的类而不是对象
7NSString不可变字符串;基础用法:创建/截取/遍历/比较/大小写转换/搜索
8NSMutableString可变字符串;基本写法是[[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];

未央书斋 温故知新

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ambrosedream

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值