这是我参与「第四届青训营 」笔记创作活动的的第1天。
以下是第一天学习 Objective-C 的笔记。
一、Xcode 工程体系介绍
- Workspace & Project
- Target
- Product
二、Objective-C 简介
Class的编写:介面与实现
- interface区可以写声明代码,包括变量和方法的声明
- implementation区可以写实现代码,主要是interface区声明的方法对应的实现代码
.h文件和 .m文件
- 类的介面可以写在 .h文件,也可以放在 .m文件
- 如果放在 .h 文件,那这个介面里的声明能被其他的 .h 或是 .m 引入及调用
- 如果放在 .m 文件里,只能在这个文件里的其它类调用
- 实现只能写在 .m文件里
- 需要在 .m文件的顶部引入 .h 文件,才能在实现代码里调用其他类的函数
- .m文件是不能被引入的,只能引入 .h,想让其他 .m调用方法,必须把它都声明在 .h
对象与构造函数
-
创建对象
// main.m #import "MyClass.h" //注意 myClass 前面必须有个 * 号,因为他是一个对象指针 MyClass *myClass = [[MyClass alloc] init]; -
重写父类默认声明的构造函数init
// MyClass.m @implementation MyClass // 覆盖父类 NSObject 的 init - (instancetype)init { self = [super init]; if (self) { self.name = @"James"; } NSLog(@"A MyClass Joined!"); return self; } @end -
可以声明一个需要参数的构造函数
// MyClass.h @interface MyClass: NSObject // 构造函数 - (instancetype)initWithName:(NSString *)name; @end // MyClass.m @implementation MyClass - (instancetype)initWithName:(NSString *)name { self = [super init]; if (self) { self.name = name; } NSLog(@"A MyClass, %@ Joined!", name); return self; } @end
函数方法
-
方法类型(+类方法 / -实例方法)
-
声明与实现
// MyClass.h @inteface MyClass: NSObject // 函数声明 - (void)sayHello; // (回传值)方法名:(参数1类型)参数1 标签:(参数2类型)参数2 - (void)groupWith:(NSString *)name; // 返回对象 - (MyClass *)groupWith:(NSString *)name andWith:(NSString *)name2; // 类方法(静态函数) + (int)staticFunction; @end// MyClass.m @implementation MyClass // 函数实现,与 Interface一一对应,但完成函数主体实现 - (void)sayHello { NSLog(@"Hi"); } - (void)groupWith:(NSString *)name { NSLog(@"Hi, I'm group with %@", name); } - (MyClass *)groupWith:(NSString *)name andWith:(NSString *)name2 { MyClass *group = [[MyClass alloc] initWithName: [NSString stringWithFormat:@"%@,%@,%@", self.name, name, name2]]; return group; } // 类方法(静态函数) + (int)staticFunction { return 0; } @end -
方法调用
// main.m #import "MyClass.h" MyClass *myClass = [[MyClass alloc] initWithName:@"James"]; // 实例方法 [myClass sayHello]; // 实例方法 - 多参数, 返回对象 [[myClass groupWith:@"Andy" andWith:@"Amy"] sayHello]; //第一个函数返回对象后再调用 // 类方法 (静态函数) int staticReturn = [MyClass staticFunction];
成员变量
-
interface变量
// MyClass.h @inteface MyClass: NSObject { // 公共变量 @public int public_int_variable; @protected double protected_double_variable; } @end -
implementation变量
// MyClass.m @implementation MyClass { // 私有 int _private_int_variable; double _private_double_variable; } @end -
调用
// 外部访问公开成员变量 MyClass->_public_double_variable = 0.1; MyClass->_public_int_variable = 0; // MyClass.m 内部可以访问公开和私有的成员变量 self->_public_double_variable = 0.1; self->_private_int_variable = 0;
三、Objective-C 语言特性
属性 @property
// MyClass.h
@interface MyClass: NSObject
@property (nonatomic, copy) NSString* name;
@end
// 声明属性等于以下代码
// MyClass.h
@interface MyClass: NSObject
// Get / Set 方法
- (void)setName:(NSString *)name;
- (NSString *)name;
@end
// MyClass.m
@implementation MyClass {
// 自动声明变量 (带底线)
NSString *_name;
}
- (void)setName:(NSString *)name {
self->_name = name;
}
- (NSString *)name {
return _name;
}
@end