OC-类和对象
定义类
面向对象程序设计中有两个重要概念,类(class)和对象(object),对象也称为实例。
类和对象是面向对象的核心
定义类的步骤:
接口部分就是对成员变量进行定义,而实现部分就是对整个接口部分进行一个想细化的说明,下面我们会提到
类型 :可以是oc允许的任何类型,包括基本类型,构造类型和各种指针类型类型;
成员变量名 :OC语言建议成员变量名以下环线开头 int _data
语法声明格式
关于 方法类型标识
+ :代表是类方法,直接使用类名即可调用
—:代表实例方法 必须用对象才能调用
eg :// 下面定义了一个 写名字和年龄的方法,void是无返回值的 ,
- (void) setName: (NSString*) name andAge :(int) age;
setName 是一个传入参数为NSString的方法,参数的名字是name,
andAge 同理 传入的int 类型赋值 age
注意 setName 与 setName :是两种不同的方法 前者不带冒号说明是一个不带形参的方法 后者这是一个带有形参的方法
类的实现
实现部分语法
关于实现部分的语法说明
- 类实现部分的类名必须与类接口部分的类名相同, 用于表示这是同一个类的接口部分和实现部分
- 类实现不部分也可以声明自己的变量,但是这和语言的函数一样 只能在当前类内访问西安挡雨 定义属于自己的隐藏成员变量
代码展示
对象的产生与使用
@interface FKperson : NSObject {
int _age;
NSString* _name;
@public;
}
- (void) setName: (NSString*) name andAge :(int) age;
- (void) say: (NSString*) content;
- (NSString*) info;
+ (void) foo;
@end
@implementation FKperson {
;
}
- (void) test {
NSLog(@"--只在实现部分定义的tset方法\n");
}
- (void) setName: (NSString *)n andAge: (int)a {
_name = n;
_age = a;
}
- (void) say:(NSString *) content {
NSLog(@"%@", content);
}
- (NSString*) info {
[self test];
return [NSString stringWithFormat:
@"我是一个NBA球员名字为: %@, 年龄为%d。", _name, _age];
}
+ (void) foo {
NSLog(@"FKperson 类的泪方法, 只通过类名进行调用");
}
@end
int main(int argc, const char * argv[]) {
@autoreleasepool {
FKperson * person = [[FKperson alloc] init];
[person say:@"Hello, I love iOS "];
[person setName:@"獭兔" andAge:27];
NSString* info = [person info];
NSLog(@"person -info 的信息为:%@", info);
[FKperson foo];
}
return 0;
}
** 值得注意的是 在实例方法info中 出现了[self ] 这个新名词**
在上面程序中,通过 FKPerson 实例调用了 say:万法,调用方法吋必须为方法的形参赋值。
因此,在这行代码中调用 FKPerson 对象的 say:方法时,必须为 say:方法传入一个字符串作为
形参的参数值,这个字符串将被赋给 content 参数
除此之外,上面程序还调用了 FKPerson 对象的 setName:andAge::万法和 info 方法:对于
test 方法,由于程序只是在 FKPerson 类的实现部分定义了该万法,故该 test 方法仅能在
FKPerson 类的内部使用,因此程序通过 FKPerson 对象不能调用 test 方法。
H面程序通过 FKPerson 类调用了foo 万法,这是因为定叉foo 方法时使用了+标识符,表
明该方法是一个类方法,因此只能通过 FKPerson 类调用
self关键字
定义
-
**Objective-C 提供了一个self 关键字,self 关键字总是指向该方法的调用者(对象或类),当 self 出现在实例方法中时,self 代表调用该方法的对象:当self 出现在类方法中时,self 代表调用该方法的类。 self 关键字最大的作用是让类中的一个方法访问该类的另一个方法或成员变量。先看下面这个例子,假设定义了一个FKDog 类,这个FKDog对象的run 方法需要调用它的jump 方法, self 总是代表当前方法的调用者,当这个方法被调用时,它所代表的对象才被确定下来: 谁在调用该方法,self 就代表谁。**
@interface fkdog : NSObject {
;
}
- (void) jump;
- (void) run;
@end
@implementation fkdog
-(void) jump {
NSLog(@"正在执行jump方法");
}
-(void) run {
[self jump];
NSLog(@"正在执行run方法");
}
@end
** 如果self出现在实例方法中,self就代表调用该方法的对象 当self出现在类方法中,self就代表调用该方法类本身 **
self案例
- 当self作为作为对象的默认引用使用时,程序可以像访问普通变量一样访问self这个引用,也可以吧self当作普通方法的返回值
@interface returnSelf : NSObject {
@public
int _age;
}
- (returnSelf*) grow;
@end
@implementation returnSelf
- (returnSelf *) grow {
_age ++;
return self;
}
@end
int main(int argc, const char * argv[]) {
@autoreleasepool {
returnSelf *rt = [[returnSelf alloc] init];
[[[rt grow] grow] grow];
NSLog(@"rt 的_age 成员变量值是: %d", rt->_age);
}
return 0;
}
id 类型
定义
- Objective-C 提供了一个id类型,这个id 类型可以代表所有对象的类型。也就是说,任意类的对象都可赋值给 id 类型的变量。
当通过 id 类型的变量来调用方法时,Objective-C 将会执行动态鄉定。所谓动态鄉定,是指 Obiective-C 将会跟踪对象所属的关,它会在运行时判断该对象所属的类,并在运行时确定
int main(int argc, const char * argv[]) {
@autoreleasepool {
id p = [[FKperson alloc] init];
[p say:@"你好,欢迎学习iOS!"];
}
return 0;
}
OC-方法详解
定义与属性
- 方法是类或对象的行为特征的抽象,也是类或对象最重组成部分。
从功能上看方法完全类似于传统结构化程序设计里的函数。值得指出的是,0bjective-C的方法不能独立存在, 所有的方法都业须定义在类里,方法在逻辑上要么属于类,要么属于对象。
属性
-
方法与传统函数具有显著不同:在结构化编程语音里,函数是 一等公民。整个软件由个个的函数组成:在面向对象的编程语言里,类才是一等公民。因此,在Objective-C 语言里方法不能独立存在,方法必须属于类或对象。 -
如果需要定义方法,则只能在类体内定义,不能独立定义一个方法(定义的只能是函数)。 -
一旦将一个方法定义在某个类的类体内,如果这个方法使用了+标识符,则这个方法就属于这个类:如果使用了 “- ” 标识符,则这个方法就属千这个类的实例,因为 0bjective-C里的方法不能独立存在,它必須属于一个类或者个对象,因此方法也不能向函数独立执行,执行方法时必须使用类或者对象来最为调用者,方法必须使用如下模板 1.类 方法] 或者2.[对象 方法]
形参个数可变的方法
图中的函数
|