面向对象与面向过程面向过程: 分步骤分析问题,然后封装在各个步骤里的函数分布解决问题。面向对象:分为各个功能而不是步骤。 类是对同一个事物高度的抽象,其中类定义了这个一类对象所队形的静态属性与动态属性。对象是类的一个实例,是一个具体的事物,类就是一种数据类型,变量为其对象。
设置器和访问器:类似Java中的setter和getter,因为oc中get有着特殊含义,所以get方法之前不用get开头。在.h文件中使用关键字“@property”,在.m文件中使用"@synthesize"。例如:@interface Person : NSObject{ int myNumber; //实例变量 }@property(nonatomic) int myNumber;@end在实现文件中:@implementation Person@synthesize myNumber;@end就相当于写的setter和getter方法。在@property()括号中,可以填写的属性:readwrite : 默认readonly : 只读,没有set方法assign : 默认,引用计数不增加retain :引用计数增加1原子性:atomic默认非原子性:nonatomicatomic是oc中的一种线程保护计数,是防止在未完成的时候,被另一个线程使用,造成数据错误。点语法:只有在属性含有property属性的时候才能使用点语法(xCode 4.0之前),点语法的使用类似java中的点语法。static关键字:类体内的全局变量声明:static int gCount = 0;
oc中的方法特点:1.两个方法是否相同,与参数类型和返回值类型无关,即不可以重载。self 和 super:1.self 指的是类对象本身。2.super是父类对象本身。3.self用来调用本类对象的方法4.super调用父类的方法什么是真相?*self是类的隐藏的参数,指向当前调用方法的类,另一个隐藏参数是_cmd,代表当前类方法的selector。*super并不是隐藏的参数,它只是一个“编译器指示符”。它和self指向的是相同的消息接受者。*当使用self调用方法时,会从当前类的方法列表开始找,如果没有,就从父类中再找,而使用super时,则从父类的方法列表中开始找,然后调用父类的这个方法。@class 和 #import区别:imort 会包含这个类的所有信息,包括实体变量和方法,而@class 只是告诉编译器,其后面声明的名称是类的名称,至于这些类是如何定义的,暂时不用考虑,后面再告诉你。在头文件中,一般只需要知道被引用的类的名称就可以了。不需要知道其内部的实体变量和方法,所以在头文件中一般使用@class 来声明这个名称是类的名称。而在实现类里面,因为会用到这个引用类内部的实体变量和方法,所以需要使用#import 来包含这个被引用类的头文件。如果有循环依赖关系,如:A->B,B->A这样的相互依赖关系。如果使用#import 来相互包含,那么就会出现编译错误,如果使用@class 在两个类的头文件中相互声明,则不会有编译器错误出现。所以,一般来说,@class是放在interface中的,只是为了在interface中引用这个类,把这个类作为一个类型来用的,在实现这个接口的实现类中,如果需要引用这个类的实体变量或者方法之类的,还需#import。
oc类声明和实现:类声明:@interface NewClassName:ParentClassName { 实例变量; ....} 方法的声明;...@end 类的实现: @implementation NewClassName 方法的实现{ //code}@end类的声明放在"类名 + .h"文件中。如:Person.h文件。类的声明主要由两部分组成:实例变量和方法。声明实例变量的格式:变量类型 变量名称。如:int age;实例变量:实例变量额可以使用oc中任何一种数据类型(包括基本类型和指针类型)在声明实例变量的时候不能初始化,系统会默认初始化。实例变量的默认作用域是整个类。Boolean 类型默认是false,所有指针类型默认是nil。oc方法声明:-(void) method : (int) arguments;"-"表示实例方法,"+"表示类方法,返回类型为空,方法名为“method:”(冒号一定不能省略),最后这个方法的参数是一个整型的参数,arguments是参数的名称。oc中进行方法调用中传递参数时,遵循值传递的原则:基本数据类型传递的是数据值本身,指针类型传递的是对象的指针,而不是对象的本身。oc中方法的调用方式有两种:1.[类名或者对象名 方法名];2.对象名.方法名;实例:[ClassOrInstance method];[ClassOrInstance method:arg1];[ClassOrInstance method1:arg1 method2:arg2];[[ClassOrInstance method:arg1] otherMethod];//嵌套发送消息。 oc基本概念——指针:*oc语言中出基本类型之外的变量类型称为指针类型。*oc中的对象是通过指针对其操作的。如何在内存中区分类和对象?*类是静态的概念,存放在代码区*对象是alloc出来的,存放在堆区,类的每个实例变量在不同的对象中都有不同的值(静态变量除外)*方法也只是在被调用的时候,程序运行的时候才占用内存。/*声明了一个NSString类型的指针变量,但它并没有指向任何一个对象*/NSString *s; //-->nil/*使用alloc方法创建了一个NSString类型的对象,并用s指向它,以后可以通过s完成对其的操作。*/s = [[NSString alloc] initWithString @"Hello World"]; // s--> 堆内存地址(譬如:ox10000258)oc中对象的创建和使用:1.oc中对象通过指针来声明,如:ClassA *object;2.oc中对象的创建,使用alloc来创建一个对象。编译器会给object对象分配一块可用的内存地址。然后要对对象进行初始化即调用init方法,这样这个对象才可以使用。如:Person *person = [Person alloc];person = [person init];同一类的每个对象有不同的实例变量的存储空间。同一类的每个对象共享该类的方法。方法嵌套的形式来调用,如:ClassA *object = [[ClassA alloc] init];对象的初始化:*对象必须先创建,然后初始化,才能使用。*NSObject *object = [[NSObject alloc] init]; 首先为对象分配内存地址,为初始化做准备。初始化是对象创建过程中将新分配的对象的状态设置为合理的初始值,使之处于可用状态的阶段。通过约定,我们要求初始方法以init开头,并且在成功完成初始化之后,返回一个动态类型对象(id),如果失败则返回nil,初始方法可以包含一个或多个参数用于指定初始值。如下所示:* -(id) initWithArgument:(int) arg;* -(id) initWithArgument1:(int) arg1 xxWithArgument2:(int) arg2;初始化方法的实现:在init方法中,若要父类完成所需的一次性初始化,需要调用[super init].init方法返回的值(id型数据),描述了被初始化的对象。将[super init] 的结果赋值给self是oc的标准惯例,这么做为了防止父类在初始化过程中返回的对象不同于原先创建的对象。在一个类里面,具有最完整的初始化参数的初始化方法通常就是指定初始化方法,子类的初始化方法必须调用父类的指定初始化方法,通过向super发送相应的消息初始化父类。相反,它们将调用参数比自己多的其他初始化方法(通过向self发送消息)。并为自身没有的参数提供初始值,在此调用序列中,最终将会调用到指定初始化方法,完成整个初始化过程。当没有指定初始化方法的时候,编译器会为类自动添加init方法,如果有,编译器就不再添加。Person *person = nil;person = [[Person alloc] init];命名规则:*类名首字母大写。*变量名和方法名首字母小写。*使用驼峰标示。
类是对同一类事物的高度抽象,类中定义了这一类对象所应具有的静态属性(属性)和动态属性(方法)。对象是类的一个实例,是一个具体的事物。类与对象是抽象与具体的关系。类其实就是一种数据类型,它的变量就是对象。类与类的继承关系。多态。
self和super关键字self指的是类对象本身 用来调用本类对象的方法super是父类对象本身 调用父类的方法@class和#import这两个指令时为了解决循环引用导致的死锁问题区别: (1)如果有循环依赖关系,如A->B,B->A这样的相互依赖关系,如果使用#import来相互包含,那么就会出现编译错误,如果使用@class在两个类的头文件中相互声明,则不会有编译错误出现。 (2)#import会包含这个类的所有信息,包括实体变量和方法,而@class只会告诉编译器,其后面声明的名称是类的名称。 (3)在头文件中,一般只需要知道被引用的类的名称就可以了。不需要知道骑内部的实体变量和方法,所以在头文件中一般使用@class来声明这个名称是类的名称。
OC的方法声明方法:是用来完成特定功能的代码片段声明格式:—(void)method: (int) arguments;“—”方法类型 (void)返回类型 method:方法名 (int)参数类型 arguments参数名“—”表示实例方法,“+”表示类方法参数: 形式参数:在方法被调用时用于接受外界输入的数据 实参:调用方法时实际传给方法的数据返回值:方法在执行完成后返还给调用它的环境的数据返回值类型:事先约定的返回值的数据类型,如无返回值,必须给出返回值类型void。 OC中方法的调用OC语言中采用特定的语言调用类或者实例(对象)的方法称为发送消息或方法调用。OC中方法的调用: 【类名或对象名 方法名】; 对象名.方法名; (点语法) 命名规则:类名首字母大写变量名和方法名首字母小写使用驼峰标示
一、面向对象与面向过程的设计思想 面向过程———分析问题的步骤 面向对象———划分若干功能二、类与对象 类:是抽象的,定义了这一类对象的静态属性(属性)和动态属性(方法); 对象:是具体的,是类的一个实例; 类是一种数据类型,他的变量是方法。三、类与类之间的关系 继承 关联 聚合四、多态五、oc与面向对象 对象是oc程序的核心。
oc类的声明和实现类的声明是通过@interface来声明一个类结构:@interface 类的名称 ;父类的名称{实例变量}方法的声明@end实现@implementation 类的名称方法的实现{//code}@end类的声明放在“类名+.h”文件中类的声明主要由两部分组成:实例变量和方法声明实例变量的格式:变量类型 变量的名称实例变量实例变量可以使用oc语言中任何一种数据类型(包括基本类型和指针类型)在声明实例变量的时候不能为其初始化,系统默认会初始化实例变量的默认作用域范围是整个类
第三章:oc之面向对象编程核心内容面向过程与面向对象的设计思想的区别类于对象的概念类于类之间的关系对象和指针如何定义一个类初始化方法对象的创建和使用self和super关键字static关键字@class和import的使用类的继承访问权限的控制方法的重写NSObject类类的封装类的多态面向对象与面向过程设计思想面向过程的解决方式是分析问题的步骤,然后每个步骤用分别的函数来解决。面向对象的解决方式是将他们划分为若干功能,而不是步骤。类与对象的概念类是对同一类事物高度的抽象,类中定义了这一类对象所应具有的静态属性(属性)和动态属性(方法)。对象是类的一个实例,是一个具体的事物。类与对象是抽象与具体的关系。类其实就是一种数据类型,它的变量就是对象。类与类之间的关系——继承关系A是B如果这句话说的通,在设计程序的时候就可以看成是继承关系。例如:学生与小学生 小学生也是学生,所以学生是小学生的父类,小学生是学生的子类。oc与面向对象对象是oc程序的核心。“万事万物皆对象”是程序中的核心思想。类是用来创见同一类型的对象的模板,在一个类中定义了该类对象所具有的成员变量以及方法。类可以看成是静态属性(实例变量)和动态属性(方法)的集合体。IOS SDK里面提供了大量供编程人员使用的类,编程人员也可以定义自己的类。
子类可以继承父类的实例变量和方法
实例方法和类方法的区别:调用类方法的格式:[类名 方法名];调用实例方法的格式:[对象名 方法名];
a retain b ,b retain a 檫~循环引用了。破解方法:直接赋值assign.不要retain,就能避免了呢。 代码里生成另外一个对象,用了alloc ,copy ,retain还要负责release它
1,创建自动释放池5.0之前写法NSAutoreleasePool *pool = [[NSAutoreleasePool alloc]init];///[pool release];5.0之后写法@autoreleasepool{////} [jack autorelease];把person放入池子中。alloc ,copy ,retain要显示释放drain不会销毁 ,release会销毁。AppKit项目中,一个事件循环里就有排空
改变p1对象的值的方法可以这样写:-(id)changeAge:(int)_Age{ Age = _Age;return self;}-(id)changeInfo:(id)_p1{ Age = [_p1 Age]; Identify = [_p1 Identify];return self;}也可以这样写:-(id)changeInfo:(id)_p1{ return _p1;} OC中,不同的方法用方法名区别,与返回值类型和参数类型无关(与C++不同)
在@interface中:@property myNumber; @synthesize myNumber;