OC学习笔记--基础篇

本文简要介绍了一些oc的基础类型,包括数组、字典、字符串、消息传递、类、对象、方法、属性、协议和转发,希望对你有帮助。

OC数据类型

在这里插入图片描述

打印—类似print

NSlog(@"hello word");

数组

NSMutableArray (可变数组)和 NSArray

NSArray *names = [[NSArray alloc] initWithObjects:@"frank", @"duck", @"monkey", nil];
NSArray *names = [NSArray arrayWithObjects:@"frank", @"duck", @"monkey", nil];
NSArray *names = @[@"frank", @"duck", @"monkey", @"cow"]

字典

NSMutableDictionary(可变字典)和NSDictionary

可变字典的使用

NSMutableDictionary *mdic = [[NSMutableArray alloc]init];
//更改和添加键值对
[mdic setObject:@"prician" forkey:@"userName"];
[mdic setObject:@"1234" forKey:@"tel"];

//删除键值对
[mdic removeObjectForKey:@"tel"]

//返回键值对个数
NSInteger count = [mdic count];

//返回val
NSString *str = [dic objectForKey:@"tel"]

字典的使用

NSDictionary *dic = @{@"userName":@"prician",@"tel":@"1234"};
//获得val
NSString *str = [dic objectForKey:@"userName"];
NSLog(@"%@",str);//prician


//获得所有的key
NSArray *keys = [dic allKeys];
NSLog(@"%@",keys);


//获得所有的val
for(NSString *key in keys){
    NSString *val = [dic ObjectForKet:key];
    NSLog(@"%@",val);
}

消息传递

//其实就是调用方法
[obj method: argument];
//c++
obj.method(argument);

声明字符串

NSString* myString = @"My String\n";

封装

声明类

以关键字@interface作为开始,@end作为结束

@interface MyObject : NSObject {
    int memberVar1; // 实体变量
    id  memberVar2;
}

+(return_type) class_method; // 类方法

-(return_type) instance_method1; // 实例方法
-(return_type) instance_method2: (int) p1;
-(return_type) instance_method3: (int) p1 andPar: (int) p2;
@end

+/- 号代表函数类型:

“+” 代表类方法,不需要实例就可以调用,与C++ 的静态函数相似,这类方法是可以直接用类名来调用的

“-” 是一般的实例方法,必须使用这个类的实例才可以调用它

- (void) setColorToRed: (float)red Green: (float)green Blue:(float)blue; /* 宣告方法*/
[myColor setColorToRed: 1.0 Green: 0.8 Blue: 0.2]; /* 呼叫方法*/

声明区域

implementation

@implementation MyObject {
  int memberVar3; //私有
}
+(return_type) class_method {
    .... //method implementation
}
-(return_type) instance_method1 {
     ....
}
-(return_type) instance_method3: (int) p1 andPar: (int) p2 {
    ....
}
@end

与Interface区别——访问权限:(看不懂可以看下图,清楚明白)

Interface区块内的实体变量默认权限为protected,implementation 区块的实体变量则默认为private。

在Implementation区块定义私有成员更匹配面向对象之封装原则,因为如此类别之私有信息就不需曝露于公开interface(.h文件)中。

封装权限:

  • @private(当前类访问权限):成员变量只能在当前类的内部访问。在类的实现部分定义的成员变量默认是@private。

  • @package(相同映像访问权限):如果类中的成员变量用@package访问控制符来限制,则这个成员变量可以在当前类以及当前类的同一个映像的任意地方访问

    所谓的统一映像指的是编译后生成的同一个框架或同一个执行文件,编译器可以将一些类编译成一个框架库,那么这个库中的类之间可以互相直接访问@package修饰的成员变量。

  • @protected(子类访问权限):如果类中的成员变量用@protected访问控制符来限制,则这个成员变量可以在当前类、当前类的子类的任意地方访问。在类的接口部分定义的成员变量默认是@protected

  • @public(公共访问权限):如果类中的成员变量用@public访问控制符来限制,则这个成员变量可以在任何地方进行访问

在这里插入图片描述

interface:声明类,implementation:定义类

创建对象

alloc:分配内存,init:初始化,若要自己定义初始化,可重写init方法(类似构造函数

MyObject * my = [[MyObject alloc] init];
//若创建对象不需要参数,则可直接使用new
MyObject * my = [MyObject new];

方法

方法声明:上面提过,主要是用加号和减号表示类方法和实例方法,后面跟着参数

方法调用:主要就是“[ ]”,[]之间可以嵌套

属性

基本的定义使用关键字@property编译选项,紧跟着类型信息和属性的名字

@property (nonatomic, strong) NSMutableArray *items;

不多说,直接看这篇博客:Objective-C属性(property)的特性(attribute)-腾讯云开发者社区-腾讯云

属性的特性:(经典永流传的图)

在这里插入图片描述

1.原子性(Atomicity

atomic(默认值)

nonatomic

  1. 存取特性(Access

readwrite(默认值)–读写

readonly–只读

3.内存管理特性(Storage

管理对象生命周期

strongweakassigncopy深拷贝

协议

@protocol作为区块起始,@end结束,中间为方法列表

@protocol Locking
- (void)lock;
- (void)unlock;
@end

注:类遵守协议的写法与swift也不一样

@interface SomeClass : SomeSuperClass <Locking>
@end

转发

Objective-C 入门教程 | 菜鸟教程

闭包

因为闭包可能会导致循环引用,所以一般用weak弱引用(之前一直都基于知道这个点的层面,今天真的是看到了这方面代码一下子结合起来了)

我们知道死锁就是两个进程或线程之间互相持有对方资源,且不释放,所以就会导致死锁

循环引用比较相似,我们一般使用weak弱引用对self进行引用,避免引用计数+1导致循环饮用
在这里插入图片描述

代码例子如下

iOS-Block 中 为何使用 weakSelf 和 strongSelf - 掘金

闭包的简单使用:

myBlock = ^(int a, int b)
{
    //coding
};
  • 17
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值