这篇文章不是教如何写Objective-C的
这篇文章不是教如何写Objective-C的
这篇文章不是教如何写Objective-C的
重要的事情说三遍,看完这篇文章,你可能不会写Objective-C , 但是你肯定能看懂部分Objective-C的代码。
那么开始吧!
基础部分 :
如果你有C或者C++ 基础,那么这部分可以跳过,因为这些基本类型,枚举,结构体,指针,循环语句,选择语句等都和C,C++ 一样
#import <Foundation/Foundation.h>
//用宏 #define 定义一个常量
#define LENGTH 12
//声明两个可以在其他文件也可以取到的整数 num1,num2 。声明可以多次进行,但是只能定义一次
extern int num1,num2;
int main(int argc, const char * argv[]) {
@autoreleasepool {
NSLog(@"Hello, World!");
//对整数num1,num2进行定义
num1 = 2;
num2 = 3;
//创建一个浮点型变量f
float f = 32.02;
//创建一个字符型变量 a
char a = 'a';
//声明并定义一个无符号整形常量
const unsigned LENGTH_SHORT = 2;
if( f >= 12.00 && a == 'a'){
int b = 6;
}else{
NSLog(@"运算符有 + - * % / ++ -- == != > >= < <= && || ! & | ^ = += -= /= %= <<= >>= &= ^=");
int trip = f < 40.0 ? 1 : 0;
int size = sizeof(trip); // return 4
}
// for 循环固定格式 ,第一个参数可以使用()外的变量
for(int i = 0 ; i < 6 ; i++){
i += 1;
}
// switch 语句
switch (a) {
case 'a':
a = 'b';
break;
default:
a = 'a';
break;
}
// 声明一个整形指针变量 p
int *p;
// 将整形变量的地址给指针变量 p
p = &num1;
// 声明一个结构体 books
struct books {
int identity;
int price;
};
// 声明一个枚举类型 Colors
enum Colors {
red,green,blue
};
}
return 0;
}
对象部分 :
#import <Foundation/Foundation.h>
@interface Person : NSObject
//属性以@property开头,它是一个关键字接下来是访问说明符,它们是非原子,读写或只读,强,不安全或不完整
//这取决于变量的类型。 对于任何指针类型,可以使用strong,unsafe_unretained或weak。
//类似地,对于其他类型,可以使用readwrite或readonly。接下来是变量的数据类型。最后,将属性名称以分号结束。
@property(nonatomic,strong) NSString *name;
@property(nonatomic,unsafe_unretained) NSNumber *age;
// - 开头的表示是实例方法, + 开头的表示为类方法,可以直接通过类名调用,如 [Person getAge]
- (void) Greet;
- (BOOL) isDone;
//SayHi有两个参数,一个是整形param1 , 一个是NSString 类型的param2
// paramForOut这个是用于在调用函数时表示第二个参数的,详见后面
- (void) SayHi:(int)param1 paramForOut:(NSString *)param2;
+ (NSNumber *) getAge;
@end
@implementation Person
//id 和 instancetype 类型都表示该类实例自己
//重写默认构造函数,不写的话OC会提供一个默认的
- (instancetype) init {
NSNumber *age = [NSNumber numberWithInt:12];
self.age = age;
self.name = @"对象字符串的便捷写法";
}
// 带参数的构造函数
- (id) initWithNameAndAge: (NSString *)name andAge: (NSNumber *)age {
self.name = name;
self.age = age;
}
- (void) Greet
{
NSLog(@"Hello My name is %@",self.name);
}
- (BOOL) isDone
{
return true;
}
+ (NSNumber *) getAge
{
return self.age;
}
- (void) SayHi:(int)param1 paramForOut:(NSString *)param2
{
NSLog(@" param2 : %@ , param1 : %d",param2,param1);
}
@end
//从这里就可以看出,paramForOut是在调用时使用的,指向第二个参数,而param2 是在声明定义函数时
//在函数内部使用的,表示第二个参数
int main(){
Person *p = [[Person alloc] initWithNameAndAge:@"tom" andAge:12];
[p SayHi:6 paramForOut:@"ya"];
[Person getAge];
}
对象高级部分 : 类别,扩展,协议
类别 :
当需要一个已有的类进行加强,比如添加一些额外的方法,那么可选的方式有类别和扩展。
在Xcode里新建一个 Objective-C File 文件,如下图
FileType这里就是文件类型,可选的有Empty file ,Category ,Extension,Protocal 。 这里我们创建一个 类别文件,选择 Category ,文件名为你给已有类添加的这些方法的‘用途说明’。
比如我想给NSString 添加一些比较大小的方法,这些方法就可以归类为比较,那文件名File就可以填 Comparable 。 在 Class这一栏,我们填入我们想要类别的类,这里我们选 NSSring
完成后会出现两个文件 ,NSString+Comparable.h , NSString+Comparable.m ,一个是头文件,一个是具体实现。
//file: NSString+Comparable.h
#import <AppKit/AppKit.h>
#import <Foundation/Foundation.h>
@interface NSString (CustomString)
- (void) whichBigger;
@end
//file: NSString+Comparable.m
#import "NSString+Comparable"
#import <AppKit/AppKit.h>
@implementation NSString (CustomString)
- (void) whichBigger{
//TODO
}
@end
//file : main.m
int main(){
NSString *str = @"ya" ;
[str whichBigger];
}
扩展 :
扩展和类别的区别在于,扩展要和类的实现写在一块,不能单独抽出去。从写法上来看扩展只要写 ( ) ,不需要写名字。
@interface Sample : NSObject {
// 在继承的后面用 {}括起来的变量是一个类的私有实例变量,只有类的实例函数可以访问,
//而不能通过类名直接访问
int num = 2;
}
- (void) sayMyName;
@end
@interface Sample ()
@property (nonatomic ,strong) NSString *name;
@end
@implementation Sample
- (id) init {
self.name = @"扩展";
num = 3;
}
- (void) sayMyName {
NSLog(@"my name : %@",self.name);
}
@end
协议 :
协议如果Java里的接口 ,集中声明一堆方法,然后实现该协议的类要写出协议里所有方法的具体实现
//file MyProtocal
#import <Foundation/Foundation.h>
@protocol MyProtocal <NSObject>
// 必须实现的方法
@required
- (void) toPlay;
// 可选的实现的方法
@optional
- (void) toDestroy;
@end
使用协议,在使用了协议的类的实现中,需要把必须的@required的方法实现
//file MyClass.m
@interface MyClass : NSObject <MyProtocal>
@end
@implementation MyClass
- (void) toPlay{
NSLog(@"start playing music");
}
@end
Objective-C 的大部分内容到此就讲完了,如果想深入了解内存管理,多态,Foundation框架等,可以自行深入了解。