setter存在的意义:
作用:用来设置成员变量,可以在方法里面过滤掉一些不合理的值
成员变量: int _age设置set方法
- (void)setAge :(int)age;参数类型和setAge之间空一格,(int)和age之间空一格
- (void) setAge : (int) age ;
setter:
1.数据安全性
2.数据过滤
getter方法:
获取成员变量
必须有返回值,返回值类型和成员变量类型一致
没有参数
点语法一般给成员变量赋值,如果不是给成员变量赋值,一般不建议使用,但是也可以使用
成员变量 int _age 的getter
- (int) age;
点语法:
点语法是相对于setter和getter来说的
- 当点语法使用在 “=“赋值符号左侧的时候,点语法会被展开为setter方法的调用,其他情况(等号右侧、直接使用)为点语法展开为getter方法的调用
点语法的本质就是调用setter和getter,点语法的本质是方法调用,而不是访问成员变量,当使用点语法时,编译器会自动展开成相应的方法进行调用,
如果没有setter和getter,则不能使用点语法
不要在setter和getter中使用本属性的点语法
- (void) setAge:(int)age {
// 下面的代码会引发死循环
self.age = age;
//编译器展开后 [self setAge:age]
}
- (int) age {
// 下面的代码会引发死循环
return self.age;
// 编译器展开后 [self age]
}
self在类方法中的表现:
- 在类方法中可以通过self来调用本类中的其他的类方法
- 不能在类方法中去调用对象方法或访问成员变量,因为对象方法与成员变量都是属于具体的实例对象的。
self在对象方法中的表现:
- 在对象方法中,可以通过self来调用本对象上的其他方法
- 在对象方法中,可以通过self来访问成员变量,不能用self调用本类的类方法
上面两个的代码体现
+ (
void
)carameWithFlahlightStatus:(
FlahlightStatus
)status
//
这是一个类方法
,
所以
,
能调用这个函数的只能是一个类
,
所以下面的
self
只能代表类
,
后面之所以
openFlahlight
方法和
closeFlahlight
方法都是类方法
,
就一目了然了
,
如果是对象方法的话
,
就违背了
// 不能在类方法中去调用对象方法或访问成员变量,因为对象方法与成员变量都是属于具体的实例对象的。
{
if (status == kFlahlightStatusOpen ) {
// [Iphone openFlahlight];
// 其实在类方法中调用类方法除了可以使用类名调用以外 , 还可以使用 self 来调用
[ self openFlahlight ];
} else
{
// [Iphone closeFlahlight];
// self == Iphone
[ self closeFlahlight ];
}
NSLog ( @" 拍照 " );
}
+ ( void )openFlahlight
{
NSLog ( @" 打开闪光灯 " );
}
+ ( void )closeFlahlight
{
NSLog ( @" 关闭闪光灯 " );
// 不能在类方法中去调用对象方法或访问成员变量,因为对象方法与成员变量都是属于具体的实例对象的。
{
if (status == kFlahlightStatusOpen ) {
// [Iphone openFlahlight];
// 其实在类方法中调用类方法除了可以使用类名调用以外 , 还可以使用 self 来调用
[ self openFlahlight ];
} else
{
// [Iphone closeFlahlight];
// self == Iphone
[ self closeFlahlight ];
}
NSLog ( @" 拍照 " );
}
+ ( void )openFlahlight
{
NSLog ( @" 打开闪光灯 " );
}
+ ( void )closeFlahlight
{
NSLog ( @" 关闭闪光灯 " );
}
全局变量,成员变量,局部变量
- 如果在— 对象方法中出现与成员变量同名的局部变量,如果此时想使用该成员变量可以通过self->成员变量名的方式
self和函数没关系,只和方法能产生关系
self只能在方法中使用;不要使用self来调用函数,也不可以在函数内部使用self;
使用self调用本方法,产生死循环
+ (
void
)openFlahlight
{
NSLog ( @" 打开闪光灯 " );
// NSLog(@"self = %p", self);
{
NSLog ( @" 打开闪光灯 " );
// NSLog(@"self = %p", self);
// 死循环
[selfopenFlahlight];// 死循环
}
self的使用场景
使用场景
:
可以用于在对象方法之间进行相互调用
可以用于在类方法之间进行相互调用
可以用于在对象方法之间进行相互调用
可以用于在类方法之间进行相互调用
可以用于区分成员变量和局部变量同名的情况,用self->访问的就是成员变量,而不是局部变量
继承
基类的私有属性能被继承,不能在子类中访问
OC中的继承是单继承
子类父类方法重名,子类可以重写方法,调用的时候是使用子类的方法,如果想使用父类的方法,用super关键字
子类不能重复定义父类已经存在的成员变量,即使是父类私有的,子类私有的也不可以
super在类方法中,就会调用父类的类方法;在对象方法中就会调用父类的对象方法
多态(多态中必须要有继承)
很多动物都需要人来喂养,人类中不可能定义太多的真多不同动物的方法来接收动物,并且完成喂养的动作,这样,在人类里面直接定义动物类来接收,注意:
想要这个动物类能接收具体的动物,那么这些具体的动物都要继承动物类
代码:
主函数:
#import
<Foundation/Foundation.h>
#import "Dog.h"
#import "Cat.h"
#import "Animal.h"
#import "Person.h"
#import "Pig.h"
#import "Dog.h"
#import "Cat.h"
#import "Animal.h"
#import "Person.h"
#import "Pig.h"
int
main(
int
argc,
const
char
* argv[]) {
Dog
*d = [
Dog
new
];
Cat *c = [ Cat new ];
Pig *p = [ Pig new ]; // 创建三个对象
[ Person food :d];
[ Person food :c];
Cat *c = [ Cat new ];
Pig *p = [ Pig new ]; // 创建三个对象
[ Person food :d];
[ Person food :c];
[Personfood:p];//人类调用类方法food,传入三个对象
return
0
;
}
Person.h
// Person.h
// day13
//
// Created by xiaomage on 15/6/19.
// Copyright (c) 2015 年 xiaomage. All rights reserved.
//
#import <Foundation/Foundation.h>
#import "Dog.h"
#import "Cat.h"
@interface Person : NSObject
/*
+ (void)food:(Dog *)dog;
+ (void)foodCat:(Cat *)cat;
// 骆驼
// 狗熊
// 豹子
// 大象
// 猴子
// 鸡
// 猪
// 草泥马
// ...
*/
+ ( void )food:( Animal *)a; // 只写一个方法 , 别的动物可以直接往里面塞了
// day13
//
// Created by xiaomage on 15/6/19.
// Copyright (c) 2015 年 xiaomage. All rights reserved.
//
#import <Foundation/Foundation.h>
#import "Dog.h"
#import "Cat.h"
@interface Person : NSObject
/*
+ (void)food:(Dog *)dog;
+ (void)foodCat:(Cat *)cat;
// 骆驼
// 狗熊
// 豹子
// 大象
// 猴子
// 鸡
// 猪
// 草泥马
// ...
*/
+ ( void )food:( Animal *)a; // 只写一个方法 , 别的动物可以直接往里面塞了
@end
// Person.m
// day13
//
// Created by xiaomage on 15/6/19.
// Copyright (c) 2015 年 xiaomage. All rights reserved.
//
#import "Person.h"
@implementation Person
+ ( void )food:( Animal *)a
{
[a eat ];
}
// day13
//
// Created by xiaomage on 15/6/19.
// Copyright (c) 2015 年 xiaomage. All rights reserved.
//
#import "Person.h"
@implementation Person
+ ( void )food:( Animal *)a
{
[a eat ];
}
@end
// Pig.h
// day13
//
// Created by xiaomage on 15/6/19.
// Copyright (c) 2015 年 xiaomage. All rights reserved.
//
#import <Foundation/Foundation.h>
#import "Animal.h"
@interface Pig : Animal
// day13
//
// Created by xiaomage on 15/6/19.
// Copyright (c) 2015 年 xiaomage. All rights reserved.
//
#import <Foundation/Foundation.h>
#import "Animal.h"
@interface Pig : Animal
@end
// Pig.m
// day13
//
// Created by xiaomage on 15/6/19.
// Copyright (c) 2015 年 xiaomage. All rights reserved.
//
#import "Pig.h"
@implementation Pig
- ( void )eat
{
NSLog ( @" 大口吃 " );
}
// day13
//
// Created by xiaomage on 15/6/19.
// Copyright (c) 2015 年 xiaomage. All rights reserved.
//
#import "Pig.h"
@implementation Pig
- ( void )eat
{
NSLog ( @" 大口吃 " );
}
@end
注意:
Animal *a1 = [Dog new];
[a1 eat];//调用的是父类特有的方法
// 注意点:在多态中,如果想调用子类特有的方法必须强制类型转换为子类才能调用
// [a1 kanJia];
Dog *d1 = (Dog *)a1;//强制类型转换
[d1 kanJia];//这样就可以调用狗特有的方法
注意:
在多态中,父类可以访问子类特有的方法———— 强制类型转换
假设 子类 Dog 有一个特有的方法bark
[dog bark];
Animal *an2 = [Dog new];
[(Dog*)an2 bark]; //把父类的指针,强制类型转换
*如果不存在多态,也就是说父类子类之间没有继承关系,是不能这么操作的
实例变量的修饰符
- 1)@public (公开的)在有对象的前