OC 类、对象的创建和使用

OOP面向对象编程 Object-Oriented Programming


什么是对象?对象是对客观事物的抽象和封装(特征数据+行为方法)
什么是类?类是对对象的抽象,是一种抽象的数据类型。
对象是类的实例,类是对象的模版。

一、function 函数

void drawShapes(id shapes[], int count){
    for(int i=0 ; i<count ; i++){
        id shape = shapes[i];
            [shape draw];
    }
}//drawShapes
  • 不在类里面,不能声明方法,只能声明C语言里的函数。
  • oc中[ ]意义:用于通知某个对象该去做什么(消息机制)
    第一项是对象,其余部分是需要对象执行的操作(即发送消息/调用方法)。
    具体过程:对象是消息的目标,先查出它属于哪一个类,再找到相应函数执行。

二、 interface接口 -> 类的声明

  1. 接口是类为对象提供的特性描述。
  2. 基本数据类型
    NSInteger整型
    NSUInteger无符号整数
    NSString字符串
    NSString* 指针类型 赋值str=@“123”
    CGFloat 小数 来自CoreGraphics框架
  3. 类声明写法:
@interface Person:NSObject{     //@interface标志,NSObject表示类的继承
    NSInteger _age;      //数据成员,实例变量
    NSString* _name;
}
//声明类的功能,类给外部提供的功能,不表示是类的全部功能。对业务逻辑进行保护
-(void) setName: (NSString*) name;   //-方法声明 (void)方法返回类型 参数
-(NSString*) name;
@end //Person
  • OC方法可以返回与C函数相同的类型:标准类型(整型、浮点型和字符串)、指针、引用对象和结构体。
  • 中缀符语法技术
    【类声明语法】 + / - (返回类型) 名字1:(类型1)参数1 名字2:(类型2)参数2 …..
    • +类型方法 [类名 类型方法]
    • -实例方法 [对象 实例方法]
      -(void)setInitX:(int)n andSetInitY:(int)d;
    
    • 例子中在第二个参数前面设置一个中缀符(andSetInitY),中缀符也是函数名的一部分。
    • 中缀符解决了方法调用时的代码可读性问题
      【调用】[test setInitX:1 andSetInitY:2];
    • 若在Java中则会写成public void setInit(int n, int d);
      Java和OC二种语法比较起来就好像是数学中的分配率:a(b+c) = ab+ac
    • 最后用表格来对比一下C和OC
比较项目 C OC
无参数 int foo(); -(int)foo;
int ret= obj->foo(); int ret = [obj foo];
一个参数 int foo(int a); -(int)foo:(int)a;
int ret = obj->foo(100); int ret = [obj foo:100];
两个参数 int foo(int a,int b); -(int) foo:(int)a :(int)b;
int ret = obj->foo(10,20); int ret = [obj foo:10 :20];
带标签 int fooAndB(int a, int b); -(int)foo:(int)a andB:(int)b;
int ret = obj->fooAndB(10,2); int ret = [obj foo:10 andB:2];

三、implementation -> 类的实现

  1. 实现是使接口能正常工作的代码
@implementation Person
-(void) setName: (NSString*) name {  
//参数要重新命名,不能与成员变量同名,否则会覆盖初始变量
    _name=name;
}
-(NSString*)name{
    return _name;
}

四、对象的创建

  1. 分配内存+初始化 (具体在下一篇构造方法中展开介绍)
    OC的对象都是动态分配在堆中,只能通过指针访问
  2. 消息机制 【接受者 消息 (方法)】
    【对象 对象方法】;
    【类名 类型方法】;
int main(int argc, const char *argv[])
{
    Shape* shape1 = [Shape new ]; //自动调用的方法
    Shape* shape2 = [ [Shape alloc] init ]; //与上一行等价,但二者指向不同地址
    return (0);
}
  1. 对象创建使用结束后需要释放内存
    • ARC (Automatic Reference Counting) 自动引用计数,释放没有指针再指向的内存块
    • MRC (Mannul Reference Counting) 手动管理,向对象发送release消息 [shape release];

五、getter/setter方法

@interface Person : NSObject{
    NSString* _name;
    NSInteger _age;
}
//声明类的功能,类给外部提供的功能
-(void)setName:(NSString*)name;  //setter方法声明
-(NSString*)name;  //getter方法声明
@end

@implementation Person
-(void)setName:(NSString *)name{      // setter方法实现,将参数name的值赋给成员变量_name
    _name=name;
}
-(NSString*)name{       // getter方法的实现,获取当前对象成员变量_name的值
    return _name;
}
@end
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1.项目经验 2.基础问题 3.指南认识 4.解决思路 ios开发三大块: 1.Oc基础 2.CocoaTouch...
    阳光的大男孩儿阅读 5,061评论 0 13
  • 307、setValue:forKey和setObject:forKey的区别是什么? 答:1, setObjec...
    AlanGe阅读 1,603评论 0 1
  • ———————————————回答好下面的足够了---------------------------------...
    恒爱DE问候阅读 1,766评论 0 4
  • importUIKit classViewController:UITabBarController{ enumD...
    明哥_Young阅读 3,922评论 1 10
  • 中午,上体育课的时候我们班在学校遇到了钟老师,陈黄龙大声喊:“中午老师好!”严璟宸问他说:“什么是中午老师好?”陈...
    祉延阅读 316评论 0 0