实例变量和方法 (Object-C语言)
实例变量和方法
实例变量的可见度(类的内部, 类的外部)
1.public: 公共的, 公开的
外部访问: 通过指向操作访问
访问格式: 对象->实例变量名
内部访问: 通过实例变量名访问
面向对象编程特性: 封装, 继承, 多态
封装的标准: 高内聚, 低耦合
内聚: 模块内部的关联程度
耦合: 模块之间的关联程度
封装的好处: 把实现部分隐藏起来, 只暴露接口部分, 你只需要了解接口部分, 就能够使用, 根本不需要关心实现部分
注: public和封装的思想相违背, 一般不使用
2.protected: 受保护的
类的外部: 是不允许访问的, 通过方法间接访问
Girl.h
@interface Girl : NSObject { //实例变量的修饰词的作用范围: 从当前修饰词开始, 到下一个修饰词或大括号}结束 @public NSString *_name;//姓名 @protected//默认 NSInteger _age;//年龄 NSString *_color;//肤色 @private CGFloat _height;//身高 }
赋值(setter, 设置器)
1.-号方法
2.返回值void
3.方法名 set+实例变量名 (注: 实例变量名不带下划线)
4.赋值有参数, 参数的数据类型与实例变量的数据类型保持一致
- (void)setAge:(NSInteger)age;
取值(getter, 访问器)
1.-号方法
2.返回值类型与实例变量的数据类型保持一致
3.方法名实例变量名 (注: 实例变量名不带下划线)
4.没有参数
- (NSInteger)age;
Girl.m
- (void)setAge:(NSInteger)age { _age = age; } - (NSInteger)age { return _age; }
main.m
[girl setAge:20];//赋值 NSLog(@"%ld", [girl age]);
3.private: 私有的, 当前的实例变量不被子类所继承
类的外部: 是不允许访问的, 通过方法间接访问
Girl.h
- (void)setHeight:(CGFloat)height;//方法名: setHeight: - (CGFloat)height;
Girl.m
- (void)setHeight:(CGFloat)height { _height = height; } - (CGFloat)height { return _height; }
main.m
[girl setHeight:1.68]; NSLog(@"%.2lfm", [girl height]); //内部访问: 通过实例变量名访问
方法(函数)
+: 类方法, 由类调用, 类方法内部不能够访问实例变量
-: 实例方法, 由对象调用
如何判断方法是不是同一个方法
1.- / +
2.方法名
如何找到方法名
1.去掉- / +, 返回值类型, 参数类型, 参数名
2.冒号也是方法名一部分
无参数
格式:
-/+ (返回值类型)方法名;
*.h
- (void)sayHi; + (void)sayHi;
*.m
- (void)sayHi { NSLog(@"Hello, 我是%@", _name); } + (void)sayHi { NSLog(@"Hello"); }
main.m
Girl *girl = [[Girl alloc] init];
[girl sayHi];
[Girl sayHi];
一个参数
格式:
-/+ (返回值类型)方法名:(参数数据类型)参数名;
*.h
- (void)sayHiToSomebody:(NSString *)name; + (void)sayHiToSomebody:(NSString *)name;
*.m
- (void)sayHiToSomebody:(NSString *)name { NSLog(@"%@向%@打招呼", _name, name); } + (void)sayHiToSomebody:(NSString *)name { NSLog(@"向%@打招呼", name); }
main.m
[girl sayHiToSomebody:@"男🐷脚"]; [Girl sayHiToSomebody:@"🐷"];
多个参数
格式
-/+ (返回值类型)方法名1:(参数数据类型1)参数名1方法名2:(参数数据类型2)参数名2 ...;
注: 有几个参数就有几个冒号
.h
//方法名 say:count: - (void)say:(NSString *)content count:(NSInteger)number; + (void)say:(NSString *)content count:(NSInteger)number;
.m
- (void)say:(NSString *)content count:(NSInteger)number { NSLog(@"说%ld次\"%@\"", number, content); } + (void)say:(NSString *)content count:(NSInteger)number { NSLog(@"说%ld次\"%@\"", number, content); }
main.m
[girl say:@"辉哥真帅" count:100]; [Girl say:@"辉哥真帅" count:NSIntegerMax];
定义一个类
OC中调用方法, 实质是发送消息
[消息接受者消息] [obj message]
.h
//特征: 颜色, 品牌, 价格(受保护的) //行为: 写字, 画画 @interface Pen : NSObject { NSString *_color; NSString *_brand; CGFloat _price; } - (void)setColor:(NSString *)color; - (NSString *)color; - (void)setBrand:(NSString *)brand; - (NSString *)brand; - (void)setPrice:(CGFloat)price; - (CGFloat)price; - (void)write:(NSString *)content; + (void)drawing:(NSString *)content; @end
.m
@implementation Pen - (void)setColor:(NSString *)color { _color = color; } - (NSString *)color { return _color; } - (void)setBrand:(NSString *)brand { _brand = brand; } - (NSString *)brand { return _brand; } - (void)setPrice:(CGFloat)price { _price = price; } - (CGFloat)price { return _price; } - (void)write:(NSString *)content { NSLog(@"写%@", content); } + (void)drawing:(NSString *)content { NSLog(@"画%@", content); } @end
main.m
Pen *pen = [[Pen alloc] init]; [pen setColor:@"黑色"]; [pen setBrand:@"中华"]; [pen setPrice:12]; NSLog(@"%@ %@ %.2lf", [pen color], [pen brand], [pen price]); [pen write:@"作文"]; [Pen drawing:@"🐷🐷"];
#include, #import, @class的区别?
1.#include 和 #import的区别(引入次数)
#include使用几次, 就引入几次
#import使用多次, 只引入一次
2.#import 和@class的区别(是否引入头文件)
#import是真实引入了头文件
@class只是告诉编译器这是一个类, 没有引入头文件
#import "Man.h"会导致循环引入头文件
使用@class告诉编译器, Man是一个类
男人 女人 家庭
男人类
特征: 妻子(女人类)
女人类
特征: 丈夫(男人类)
家庭
特征: 妻子(女人类) 丈夫(男人类)
男人类
Man.h
@class Woman; @interface Man : NSObject { NSString *_name;//姓名 Woman *_wife;//妻子 } - (void)setName:(NSString *)name; - (NSString *)name; - (void)setWife:(Woman *)wife; - (Woman *)wife; @end
Man.m
#import "Man.h"
#import "Woman.h" @implementation Man - (void)setName:(NSString *)name { _name = name; } - (NSString *)name { return _name; } - (void)setWife:(Woman *)wife { _wife = wife; } - (Woman *)wife { return _wife; } @end
女人类
Woman.h
@class Man; //一般@class要配合#import使用, 避免出现循环引入头文件, 在.h中使用@class, 在.m中使用#import @interface Woman : NSObject { NSString *_name;//姓名 Man *_husband;//丈夫 } - (void)setName:(NSString *)name; - (NSString *)name; - (void)setHusband:(Man *)husband; - (Man *)husband; @end
Woman.m
#import "Woman.h" #import "Man.h" @implementation Woman - (void)setName:(NSString *)name { _name = name; } - (NSString *)name { return _name; } - (void)setHusband:(Man *)husband { _husband = husband; } - (Man *)husband { return _husband; } @end
家庭
Family.h
@class Man, Woman; @interface Family : NSObject { Man *_husband;//丈夫 Woman *_wife;//妻子 } - (void)setHusband:(Man *)husband; - (Man *)husband; - (void)setWife:(Woman *)wife; - (Woman *)wife; @end
Family.m
#import "Family.h" #import "Woman.h" #import "Man.h" @implementation Family - (void)setHusband:(Man *)husband { _husband = husband; } - (Man *)husband { return _husband; } - (void)setWife:(Woman *)wife { _wife = wife; } - (Woman *)wife { return _wife; } @end
main.m
//有一天, 一个男人从天而降 Man *xiaoming = [[Man alloc] init]; [xiaoming setName:@"小明"]; //也许是命中注定, 一不"小心", 撞倒了她(一个女人) Woman *xiaohua = [[Woman alloc] init]; [xiaohua setName:@"小花"]; //她并没有生气, 相反的, 告诉他:"你是我的人了" //他们相互对视, 长相厮守 [xiaoming setWife:xiaohua]; [xiaohua setHusband:xiaoming]; //组建了家庭, 从此过上了幸福的生活 Family *family = [[Family alloc] init]; [family setHusband:xiaoming]; [family setWife:xiaohua]; //如何找到男人的名字 NSString *name = [xiaoming name]; NSLog(@"%@", name); name = [[xiaohua husband] name]; // Man *man = [xiaohua husband]; // name = [man name]; NSLog(@"%@", name); name = [[family husband] name]; NSLog(@"%@", name); name = [[[family wife] husband] name]; NSLog(@"%@", name);