OC学习过程中的一些总结

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 ( @" 关闭闪光灯 " );
}


全局变量,成员变量,局部变量
  • 如果在— 对象方法中出现与成员变量同名的局部变量,如果此时想使用该成员变量可以通过self->成员变量名的方式



self和函数没关系,只和方法能产生关系
self只能在方法中使用;不要使用self来调用函数,也不可以在函数内部使用self;

使用self调用本方法,产生死循环
+ ( void )openFlahlight
{
   
NSLog ( @" 打开闪光灯 " );
//    NSLog(@"self = %p", self);
    // 死循环
    [selfopenFlahlight];// 死循环
}


self的使用场景
使用场景 :
 
可以用于在对象方法之间进行相互调用
 
可以用于在类方法之间进行相互调用
 
 可以用于区分成员变量和局部变量同名的情况,self->访问的就是成员变量,而不是局部变量



继承
基类的私有属性能被继承,不能在子类中访问
OC中的继承是单继承
子类父类方法重名,子类可以重写方法,调用的时候是使用子类的方法,如果想使用父类的方法,用super关键字
子类不能重复定义父类已经存在的成员变量,即使是父类私有的,子类私有的也不可以

super在类方法中,就会调用父类的类方法;在对象方法中就会调用父类的对象方法


多态(多态中必须要有继承)
很多动物都需要人来喂养,人类中不可能定义太多的真多不同动物的方法来接收动物,并且完成喂养的动作,这样,在人类里面直接定义动物类来接收,注意:
想要这个动物类能接收具体的动物,那么这些具体的动物都要继承动物类
代码:
主函数:
#import
#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];
    [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
#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 ];
}
@end

//  Pig.h
//  day13
//
//  Created by xiaomage on 15/6/19.
//  Copyright (c) 2015 xiaomage. All rights reserved.
//

#import
#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 ( @" 大口吃 " );
}
@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 (公开的)在有对象的前

你可能感兴趣的:(OC编程开发)