本文简要介绍了一些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 *aMutableDictionary = [[NSMutableArray alloc]init];
NSMutableDictionary *params = [[NSMutableDictionary alloc] initWithDictionary:[self.dataMgr.preInvoiceModel toDictionary]];
消息传递
//其实就是调用方法
[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
- 存取特性(Access
readwrite(默认值)–读写
readonly–只读
3.内存管理特性(Storage
管理对象生命周期
strong、weak、assign、copy深拷贝
协议
@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
};