手机版 欢迎访问it开发者社区(www.mfbz.cn)网站

当前位置: > 开发

Object C 吐槽学习

时间:2021/4/17 0:32:12|来源:|点击: 次

CLsays:学过这么多基础语法,当接触到 Object C 的时候,还是忍不住想要吐槽它一波,实在是太复杂了。特别是方法的调用那个【】看得人发懵,用. 不香吗,写的时候老是改不过来,哎

1.类

  • @interface 相当于java中的接口,里面定义属性和方法,方法前"+“代表类的方法,”-"代表对象的方法
  • @implementation 相当于实现接口,即相当于实现方法
Student.h
@interface Student : NSObject
{
@public
    float weight;
    int age;
    
}

-(void)eat;

@end
#import <Foundation/Foundation.h>
#import "Student.h"



@implementation Student

-(void)eat{
    NSLog(@"年龄为%d岁的人体重%f公斤",age,weight);
}

@end

2.属性

@property (特性一,特性二…) 变量类型 变量名

@property (weak, nonatomic) IBOutlet UILabel *lable;

上面这个是 IOS 中经常看到的从 storyboard 拖拽布局到对应的ViewController 产生的属性,属性是 类似java中set get 方法的合体,有效的减少了代码量

默认情况下,属性是atomic的,表示具有原子性,所以由编译器生成的set和get方法提供了健全的在多线程的环境中访问属性的功能,get 方法的返回值或通过 set方法设置的值可以完全不受其他线程执行的影响,而进行设置。但是,如果将属性的特性设置为nonatomic,则标明set和get方法是非原子操作,它不使用同步锁,所以也就不能保证set和get方法不受其他线程的影响。

weak 相当于java中的弱引用,来表明这个属性是弱引用的。

3. 协议

协议其实就相当于java中的接口,声明协议的具体语法格式如下

@protocol
协议名称方法声明
@end

新建一个协议:
image-20210416184005877

MyProtocol.h:

#import <Foundation/Foundation.h>

NS_ASSUME_NONNULL_BEGIN
///<>表示遵循的协议
@protocol MyProtocol <NSObject>
-(void)run ;
-(void)eat ;
@end

NS_ASSUME_NONNULL_END

Person.h:

#import <Foundation/Foundation.h>
#import "MyProtocol.h"

NS_ASSUME_NONNULL_BEGIN

@interface Person : NSObject<MyProtocol>

@end

NS_ASSUME_NONNULL_END

Person.c

@implementation Person


- (void)eat {
    NSLog(@"我在吃饭啊");
}

- (void)run {
    NSLog(@"我在跑步啊");
}

@end

4. 代理

顾名思义,代理就是某些事情自己不能亲自完成,需要找其他人帮忙,即交给代理对象去做。例如,领导要出差,他没有时间购买机票,就把买票的事情委托给了助理,助理需要做的事包括询问票价和票的剩余张数。这时,助理就是一个代理对象,他用于完成领导委托给他的事情。接下来,通过一个案例来模拟实现助理买票的功能,具体步骤如下

  • 创建一个代理类,相当于接口 这个接口就是代理要做的事情,假设老板需要让代理去帮他买票
    TicketDelegate.h:
//用协议定义两个代理方法
@protocol TicketDelegate <NSObject>

-(void) buyTickets;
-(double)checkTicketsPrice;

@end

现实生活中不同的代理的价格不一样,但是他们都有上面那个买票的方法,故再来一个实际的代理人
Assistant.h

@interface Assistant : NSObject<TicketDelegate>

-(void)buyTickets;
-(double)checkTicketsPrice;

@end

最后leader需要持有这个代理人的对象,帮他去买票,根据依赖倒置原则(程序应该依赖于抽象接口,而不应该依赖于具体2实现),leader中依赖的是这个TicketDelegate 代理对象。
Leader.h:

@interface Leader : NSObject

-(void)buyTicket;

@property(nonatomic,weak) id<TicketDelegate>delegate ;

@end

Leader.m:

@implementation Leader

-(void)buyTicket{
    [_delegate buyTickets]
}

@end

使用方法
Main.m

Leader *leader = [[Leader alloc] init];
    
Assistant *assis = [[Assistant alloc]init];
    
leader.delegate = assis;
    
[leader buyTicket];

Copyright © 2002-2019 某某自媒体运营 版权所有