1 类是对象的类型,对象是类的实例
2 成员变量,用来区分同一个类的不同对象。(描述对象的)
静态成员:描述整个类的特征。(描述类的)
非静态成员变量:描述不同对象的特征(描述对象用的)
成员变量可以是各种类型:简单类型、指针、引用、复合类型、其他类
常量成员:必须在创建一个对象的时候,初始化它的常量成员,且常量成员的值不能改变。
3 成员函数:用来描述一个类对象的函数,叫成员函数。
静态成员函数:属于整个类的成员函数。
把类的数据成员对外隐藏,使之从外部不可见,称为信息隐藏。
成员函数是给外部访问的接口。
4 一般来说,成员变量是私有的,成员函数为公有的
外部只能通过公有的成员函数才能访问对象,则把对象的私有数据保护起来。这种方式就是封装。
5 objective-c与c++的区别是:
(1)在C++中使用.h作为头文件的后缀名,使用.cpp作为实现文件的后缀名。而ObjC中虽然也是用.h作为头文件的后缀名,但是却使用.m作为实现文件的后缀名。
(2)在c语言或C++中,用#include包含头文件 为了防止头文件被重复包含,需要使用头文件预处理防止头文件的重复包含,而Objc使用#import本身就有防止头文件被重复包含的功能。
6. (1)在C++中使用关键字class声明类,在{}内声明成员变量与成员函数,并用分号“;”作为类声明的结束标志,在实现文件中绑定符“::”将类名与自己实现的成员函数进行绑定。而在objective-c在.h文件中使用@interface关键字声明类,在{}内声明成员变量(只能是非静态成员变量,即实例变量),以@end作为类声明的就结束标志。在{}之后@end之前声明成员函数(包括类方法和实例方法也就是静态方法与非静态方法)和类变量。格式如下:
@interface className:parent<protocol,>
{
//实例变量的声明
}
method declaration//方法声明 包括静态方法与非静态方法
Type type; //定义静态变量 即类变量
@property (属性参数1,属性参数2,,) 数据类型 1 数据名1,数据类型2 数据名2......;
@end
(2)objective-c使用@implementation作为.m文件中类实现的开头标志,以@end作为结束标志,格式如下:
@implementation className //类代码的开始
@synthesized propertName;
methodDefinition //方法的实现
@end
7 .注意:在oC中默认的成员变量时protected保护类型的(类成员与所有函数都是公有的),如果想在main函数就是在外部访问,要么通过调用getter方法实现,要么将其声明为公有的 即在实例成员变量前面加@public即可。
8 OC定义了一个根类:NSObject,每一个新建的OC类都应该为NSObject的派生类。NSObject为运行时系统提供了大量的方法。
9 方法声明的一般格式是:
(mtype)(returnType)name1:(Type1)param1 name2:(Type2)param2..............
mtype:方法类型(+或者-)retuenType:返回值类型 type1和type2:参数类型 param1和param2:参数名称 name1和name2等:标签名
注意:每一个参数前要有一个标签名并用“:”隔开,前一部分与后一部分用空格隔开。
- 在OC中,当方法需要参数时,方法名前要加冒号,冒号前面的标示符为标签名,所有的标签名和冒号构成了整个方法的方法名,即冒号也是方法名的一部分。即方法名为标签名1:标签名2:标签名3:,,,,,
- 类的方法有两种:类方法和实例方法(就是静态方法与非静态方法),如果mtype为+,表示的是类方法(静态方法),如果为-表示的是实例方法(对象方法)
-(id)标签1:(type1)参数1 标签2:(type2)参数2......
{
if(self=[super init])
{
//进行类对象成员的初始化赋值
}
return self;
}
解释如下:super即父类指针,self=[super init]是一个赋值语句,如果赋值成功则self为真,说明初始化父类的成员成功。与C++相同,就是调用父类的初始化成员变量(父类构造函数)的方法对从父类继承而来的变量或方法进行赋值初始化
11 类对象的建立格式如下:
类名 *p1 =[[类名 alloc] init];然后再调用初始化方法进行成员变量的初始化
[p1 标签1:实参值1 标签2:实参值2 ..........标签n:实参值n] 或者是
类名 *p1=[[类名 alloc] 标签1:实参值1 标签2:实参值2 ..........标签n:实参值n];在定义的同时进行初始化
12 OC调用方法的格式如下: [类指针名 方法名]或[类指针名 标签1:实参1 标签2:实参2...... 标签n:实参n]
或者是(*类指针名).公有方法名 也可以是: 类指针->公有成员
特别注意:因为OC中成员变量默认是保护的,要想在外部不调用setter和getter方法直接访问,除非在类定义成员的前面加上@public 。其次常见这种格式:类指针.成员变量=值;或输出“类指针.成员变量” 看似好像是直接利用对象来调用成员来进行赋值或输出,其实在调用成员变量的setter与getter方法。如果没有为成员变量定义实现setter与getter方法 且没有用@property让系统自动生成setter与getter方法就直接用“ 类指针.成员变量”来进行访问与赋值的话就会造成错误。
代码验证如下:
13 NSObject的初始化即构造函数是-(id)init 析构函数名为-(void)dealloc; 所以当手动的类重写根类的这两个方法时,不用再声明。切记:
(1)初始化函数返回类型是id,返回self,且初始化语句必须写在if(self=[super init]){ } 判断语句中;
(2)重写dealloc的话必须要有[super dealloc];
13、任何类OC类(必须继承NSObject),都可以重写-(NSString *)description方法,相当于Java中的toString()方法,返回NSString *,即用%@输出对象指针时,系统会自动调用重写的description.。
在Circle.h文件中编辑代码如下
//
// Circle.h
// Test2
//
// Created by apple on 15/8/8.
// Copyright (c) 2015年 liu. All rights reserved.
//
#import <Foundation/Foundation.h>
@interface Circle : NSObject
{
@public
int x;//实例变量的声明,相当于成员变量
int y;
int radius;
}
-(id)initWithX:(int) _x andY:(int) _y andRad:(int) _r;
-(void)setX:(int)_x;
-(int)x;
-(int)y;
-(void)setR:(int)_r andX:(int)_x andY:(int) _y;
-(void)print;
+(int)allNum;
@end
在Circle.m中编辑代码如下:
//
// Circle.m
// Test2
//
// Created by apple on 15/8/8.
// Copyright (c) 2015年 liu. All rights reserved.
//
#import "Circle.h"
@implementation Circle
- (id)initWithX:(int)_x andY:(int)_y andRad:(int)_r
{
if(self=[super init]) //意思是调用父类的部分
{
x=_x;
y=_y;
radius=_r;
}
return self;
}
int sum;
-(int)r
{
NSLog(@"返回成员变量radius");
return radius;
}
-(void)setX:(int)_x
{
NSLog(@"调用x的setter方法赋值");
x=_x;
}
-(int)x
{
NSLog(@"返回成员变量x");
return x;
}
-(int)y
{
NSLog(@"返回成员变量y");
return y;
}
-(void)print
{
NSLog(@"Radius :%d X:%d Y:%d",radius,x,y);
}
-(void)setR:(int)_r andX:(int)_x andY:(int)_y
{
radius=_r;
x=_x;
y=_y;
}
+(int)allNum
{
return sum;
}
@end
在main.m中编辑代码如下:
#import <Foundation/Foundation.h>
#import "Circle.h"
int main(int argc, const char * argv[])
{
@autoreleasepool {
Circle *c=[[Circle alloc] init];
[c setR:3 andX:4 andY:5];
[c print];
[c setX:23];
printf("[c x]=%d c.x=%d c->x=%d\n",[c x],c.x,c->x);
NSLog(@"%d",[Circle allNum]);
c->radius=2;
[c release];
}
return 0;
}
运行结果如下: