15分钟看懂Objective-C

这篇文章不是教如何写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框架等,可以自行深入了解。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值