美文网首页
Objective-C学习笔记

Objective-C学习笔记

作者: 苦苦修行 | 来源:发表于2019-06-17 17:36 被阅读0次

基于
Objective-C基础教程:1天玩转Objective-C语法
【C基础】#if、if、#ifdef、#if defined之间的区别
成员变量和属性区别(@property那点事儿)

  • Foundation/Foundation.h是 Foundation 框架的头文件,只要引入了它,就可以使用 Foundation 框架的所有功能了。这是一个核心库
  • 在 oc 中,字符串必须要加@,比如:@"hello world"
  • Foundation框架中的很多数据类型名、变量名、函数名都是以NS开头,乔布斯以此来纪念自己的公司 NeXTSTEP。
  • 头文件(.h)中定义的属性和方法才能被外界访问,类实现文件(.m)中定义的不能被外界访问
  • 类在.h文件和.m文件中都可以引入头文件,区别是:在.h文件中引入头文件,.h和.m文件都可以使用这个文件中的资源;如果在.m文件引入头文件,.h文件不能使用该文件中的资源。
  • 类定义举例:
#import <Foundation/Foundation.h>
//引入头文件
@interface Person : NSObject{
//声明成员变量(很少用,如果没有声明成员变量的话,可以省略大括号。)
}
//声明属性
@property int age;//基本数据类型(默认会生成对应的 set 和 get 方法。另外会默认生成对应的成员变量_age);语法规定,不能初始化
@property (NSString*) str;//对象类型或引用类型
//声明方法之类方法的创建(+号):
+(int)personWithA1:(float)a1 andA2:(NSString*)a2; //a1,a2分别代表两个参数
//声明方法之对象方法的创建(-号):
-(int)personWithA1:(float)a1 andA2:(NSString*)a2;
@end
  • 类实现举例:
#import "Person.h"
//引入头文件
@implementation Person
//对声明的方法进行实现
@end 
  • 方法调用:(在 oc 中,准确的说是“ 消息传递”)
    //调用类方法
    [Person personWithA1:2 andA2:@"类方法"];//通过类直接调用
    //调用对象方法
Person * obj1=[[Person alloc]init];
[obj1 personWithA1:1 andA2:@"对象方法"];//通过类对象调用
  • 点语法的底层实现:(点语法,简单的理解,就是通过“.”的方式通过调用类中的set或get方法操作属性。)重点在于如何改写 set 和 get 方法。
    我们写的代码:
//.h 文件
#import <Foundation/Foundation.h>
@interface Person : NSObject
@property NSString * name;
@end
//.m 文件
#import "Person.h"
@implementation Person
@end 

完整实现:

//.h 文件
#import <Foundation/Foundation.h>
@interface Person : NSObject{
//编写习惯,一般声明成员变量的时候名字前面加“_”,同时也是为了和下边声明的name相对应。
NSString * _name;
}
@property NSString * name;//通过这行代码,OC底层隐式地声明了两个方法: set 和 get 方法
@end
//.m 文件
#import "Person.h"
@implementation Person
@synthesize name=_name;//将_name和name进行绑定;对在.h文件声明的get方法和set方法做实现
@end
  • @propertye常用的修饰词
    nonatomic、copy、strong、assign、weak、readwrite、readonly等
    assign:用于基础类型
    copy:一般使用于字符串,再复制一份
    weak:弱引用。
  1. 有个比喻:对于weak来说,就相当于旁边看放风筝的人,他们只能用手指着你手里的风筝,大喊着“风筝风筝”,他们只能和你一起欣赏风筝,而对于是不是继续放风筝的决定权在你,如果你不在放风筝了,那他们也只能“各回各家,各找各妈”;
  2. 用OC的语言来表达,就是说用weak声明的属性虽然也可以访问内存,但是要在这块内存没有释放之前,一旦这块内存被释放之后,weak声明的属性将失去作用。
  • 结构体是值类型
    在OC中struct是值类型的,也就是说当将一个结构体赋值给另一个结构体时,二者实际上是相互独立互不影响的。
    直接访问使用结构体变量名.成员名,间接访问使用(*结构体指针名).成员名或者使用结构体指针名->成员名。(总结来说,通过值访问就用点符号,通过指针访问就用->)
  • id 类型:可以认为是任意类型
  • SEL 类型:可以认为是方法的指针类型。在 oc 中表示方法的编号
  • 类别:
  1. 类别能够在原有类的基础上添加新的方法,而且还不会让子类继承。
  2. 类扩展能添加属性和方法,而类别只能添加方法

定义:

//Person+NewFuntion.h文件
#import "Person.h"
@interface Person (NewFuntion)
//添加方法
-(void)eat;
@end

实现:

#import "Person+NewFuntion.h"
@implementation Person (NewFuntion)
//实现方法
-(void)eat{
    NSLog(@"the person is eating!");
}
@end

使用:

#import <Foundation/Foundation.h>
#import "Person.h"
//一定要引入类别的接口文件,否则无法使用类别中添加的方法
#import "Person+NewFuntion.h"
int main(int argc, const char * argv[]) {
    Person * person=[[Person alloc] init];
    person.name=@"张三";
    person.age=10;
    [person run];
    //调用类别中增加的eat方法
    [person eat];
    return 0;
}

  • 协议:OC语言是单继承多协议的语言(类型于 java 中的接口)
  1. 协议没有父类(协议可以服从多个(>=0)协议(一般服从NSObject协议)
  2. 协议中不能定义变量(属性),只能定义方法。
    声明一个协议:
@protocol ChildrenDelegate <NSObject>//协议声明
-(void)eat;
@end

声明一个符合此协议的对象属性

@interface Children : NSObject
@property(nonatomic,weak)id<ChildrenDelegate>delegete;//一个实现此协议的任意类型的对象属性
@end 

真正实现此协议的类

@interface Nanny : NSObject<ChildrenDelegate>
@end

综合使用:

int main(int argc, const char * argv[]) {
    Children  * child=[[Children alloc] init];
    Nanny * nanny=[[Nanny alloc] init];
    child.delegete=nanny;
    if ([child.delegete respondsToSelector:@selector(eat)]) {
        [child.delegete  eat];
    }
    return 0;
}

@selector(eat)返回 eat 方法的编号,它是个 SEL 类型

  • oc 中的数组对象,键和值都必须是对象
  • oc 中的数组,以如下形式初始化,必须以 nil 结束,代表数组的结尾。如:NSArray * array1=[NSArray arrayWithObjects:@"0",@"1",@"2",@"3", nil];
  • 在使用代码块的时候,对于全局变量,在块内是完全可操作的。但是对于局部变量来说,在块内只能使用不能更改。
    如果试图在块内更改局部变量的值,程序会报错,解决的方案是在声明局部变量时添加_block关键字(注意是两个“”)
  • nil, NULL, Nil 的区别:
    nil定义某一实例对象为空值,如NSObject* obj = nil;
    Nil 定义某一类为空,如Class someClass = Nil;
    NULL 定义基本数据对象指针为空,如int *pointerToInt = NULL; char *pointerToChar = NULL; struct TreeNode *rootNode = NULL;

延申阅读:

相关文章

网友评论

      本文标题:Objective-C学习笔记

      本文链接:https://www.haomeiwen.com/subject/qtdafctx.html