一、基础语法学习
1、OC使用常量字符串前面必须加一个@
"jack" : 这是C语言字符串
@"jack" : 这是OC语言字符串常量
%p : 打印的是指针变量的数值
%@ :打印的是指针变量指向的对象
2、@符号的作用
a、将C语言字符串转化为OC字符串 "jack" @"jack"
b、OC绝大部分关键字都是以@符号开头: @property、@synthesize、@synchronize、@selector等
3、BOOL和Boolean区别
BOOL : 只存储YES和NO
Boolean : 只存储true和false
4、NSString字符串常用方法
NSString stringWithUTF8String : 可以把C语言字符串转换为OC字符串
NSString stringWithFormat : 可以将变量或者其他数据拼接成OC字符串
NSString characterAtIndex : 拿到字符串索引下标的字符 [@"abcdefg" characterAtIndex:2] 结果是c
NSString isEqualToString : 判断两个字符串内容是否相等
NSString compare : 比较两个字符串大小
5、nil、Nil、NULL的区别
- Nil: 表示置空一个类。
- nil: 一般是指把一个对象置空,完全从内存中释放。(void *)0, 用于OC语言的
- NULL: (void *)0, 用于C语言的
6、Objective-C的static关键字,只用于修饰变量
- 修饰全局变量
- 修饰局部变量
7、self关键字
- 指向当前对象
- 指向当前类
8、SEL(@selector)使用
-
父类 SelectorDemo.h
#import <Foundation/Foundation.h>@interface SelectorDemo : NSObject @property (nonatomic, assign) SEL methodTest; -(void)TestParentMethod; -(void)TestChildMethod; @end
-
父类 selectorDemo.m
#import "SelectorDemo.h" @implementation SelectorDemo -(void)parentMethod{ NSLog(@"parent method call success"); } -(void)TestParentMethod{ if (_methodTest) { [self performSelector:_methodTest withObject:nil]; } } -(void)TestChildMethod{ if (_methodTest) { [self performSelector:_methodTest withObject:nil]; } } @end
-
子类SelectorSub.h
#import "SelectorDemo.h" @interface SelectorSub : SelectorDemo @end
-
子类SelectorSub.m
#import "SelectorSub.h" @implementation SelectorSub -(void)SubMethod{ NSLog(@"sub class method call success"); } @end
-
调用方式
- (void)viewDidLoad { [super viewDidLoad]; SelectorSub *SClass = [[SelectorSub alloc] init]; // 拿到父类的方法 SClass.methodTest = @selector(parentMethod); [SClass TestChildMethod]; // 拿到子类的方法 SClass.methodTest = @selector(SubMethod); [SClass TestParentMethod]; }
9、instancetype和id的区别
相同点: instancetype 和 id 都是万能指针,指向对象。
不同点:
a.id在编译的适合不能判断对象的真实类型;instancetype在编译的时候可以判断对象的真实类型
b.id可以用来定义变量,可以作为返回值类型,可以作为形参类型;instancetype只能作为返回值类型
注意:以后凡是自定义构造方法,返回值类型尽量使用instancetype,不要使用id
10、NSStringFromClass()与NSClassFromString区别
-
NSClassFromString使用方式:利用一个字符串来创建一个类
NSString *responseClass =@“MyModel”; MyModel *model=[[NSClassFromString(responseClass) alloc] init];
-
NSStringFromClass使用方式:获取与类型名称同名字的字符串
MyModel *model=[MyModel alloc] init]; NSString *responseClass =NSStringFromClass([model class]);
二、类的语法学习
1、对象的声明和实现
//类的声明
@interface Person : NSObject {
@public
NSString *_name;
int _age;
float _height;
}
//无参数
- (void) run;
//一个参数
- (void) eat:(NSString *) foodName;
//返回值 + 多个参数,- :属于对象方法,+: 属于类方法
- (int) sum:(int)sum1 : (int)sum2; // 属于对象方法
+ (int) sum:(int)sum1 : (int)sum2; //属于类方法
@end
//类的实现
@implementation Person
- (void) run {
NSLog(@"i am is paopao");
}
- (void) eat:(NSString *) foodName {
NSLog(foodName);
}
- (int) sum:(int)sum1 : (int)sum2 {
return sum1 + sum2;
}
+ (int) sum:(int)sum1 : (int)sum2 {
return sum1 + sum2;
}
@end
调用方式:
Person *person = [Person new];
//调用参数
person->_name = @"11111";
person->_age = 17;
//调用方法
[person run];
[person eat:@"1111111"];
int sumNumber = [person sum:1:2];
NSLog(@"sum is %d",sumNumber);
2、@property参数介绍
-
读写属性 : (readwrite/readonly)
readwrite : 可读可写,默认 readonly : 只能读
-
内存管理: (assign/retain/copy/weak/strong)
assign: 简单赋值,不更改索引计数,适用于基础的数据类型使用。 默认 retain: 指针拷贝,释放旧的对象,将旧对象的值赋予新对象,引计数+1,深拷贝。适用于NSObject和其子类 copy: 内容拷贝,释放旧对象,将旧对象的值赋予新的对象,引计数不增加,浅拷贝。适用于NSString类 strong: 强引用,该对象引用计数为0后才进行释放。 默认 weak: 弱引用,该对象用完后马上进行释放。
-
原子性: (nonatomic/atomic)
atomic: 在多线程情况下,编译器会自动生成一些互斥加锁代码,避免该变量的读写不同步问题。默认 nonatomic: 该对象无需考虑多线程的情况,编译器少生成一些互斥加锁代码,可以提高效率
3、@synthesize: 帮助生成成员变量的setter和getter方法的实现。
//使用方式
@synthesize age=_age;
相当于下面的代码:
- (void)setAge:(int)age
{
_age=age;
}
- (int)age
{
return _age;
}
4、init和dealloc方法作用
- init : 用于参数初始化、新创建的对象等。
- dealloc: 在对象被释放之前调用,用于释放对象占用的资源,如释放实例变量、移除观察者等。
5、NSObject类介绍以及使用
NSObject类是Foundation框架中的类,其他类需继承NSObject后,可以拿到该类的对象的指针。
#import <Foundation/Foundation.h>
@interface Person : NSObject
- (void)sleeping;
- (void)running;
@end
6、description方法
每一个NSObject对象里面都包含description()方法,打印结果是@<对象所属的类型:对象的地址>。相同于java中的toSting()方法可以重写
7、重写init的方法的规范
@interface Person : NSObject
-(instancetype) init {
self = [super init]; //必须调用父类的init初始化,保证父类属性初始化
if(self) { //必须判断是否为空,很有可能初始化失败,返回为nil
self.name = @"zhangsan";
}
retrun self;
}
@end
8、自定义构造init方法的规范
-
定义方式
@implementation Person : NSObject //自定义方法必须以 initWithXXX作为开头,否则self无法使用 -(instancetype) initWithName: (NSString *)name { self = [super init]; //必须调用父类的init初始化,保证父类属性初始化 if(self) { //必须判断是否为空,很有可能初始化失败,返回为nil self.name = name; } retrun self; } @end
-
使用方式
Person *person = [[Person alloc] initWithName:@"zhangsan"];
9、@class使用
解决相互导入的问题,可以使用@class方式去解决相互依赖问题
10、分类格式
-
格式
本类名 + 分类名字 People+Student.h People+Student.m
注意事项
1、分类只能增加方法,不能增加属性
2、分类可以使用@property,不能生成私有属性,只能声明getter、setter的声明,不能实现
3、在分类中不能直接访问本类的私有属性,但可以用getter和setter去访问
4、分类与本类有相同名字,优先调用分类的方法-
分类使用场景
当一个类有很多方法和模块时候,可以将功能相似的方法写在同一个模块中