类和对象
- 对于对象 +对于类
(id) 类似于C语言中的(void *) 泛指指针的返回地址
实例变量可见度 (了解)
public 公共的共有的 实例变量可以在类的外部和内部操作 访问方式可以通过 :对象 + 指向操作符 + 实例变量 例如: p->name;
protected 受保护的 默认的 实例变量只能在该本类和子类内部操作
private 私有的 实例对象只能在该类内访问,不可以在子类文件以及其他文件中访问.
实例变量定义在.h中 相当于先声明某一变量是某一类型的实例变量. 不设置可见度的时候,为默认的 受保护的 protected 定义方式
为什么不声明为@public :1. 外部就可以访问内部以及修改,会影响内部的一个实现,提供外部访问的接口.
2.违背了OC三大面向对象的思想——封装 隐藏内部实现,提供外界访问的借口.
为什么不声明为@private :1.子文件访问不到,子文件还需另外声明.2.违背oc的继承父类有 子类就可以用
@public //单独
NSString *name;//姓名
@private//范围也为单独的
NSString *gender;//性别
@protected
NSInteger age;//年龄
NSString *name;//姓名
@private//范围也为单独的
NSString *gender;//性别
@protected
NSInteger age;//年龄
@public //整体 作用范围为整体.
NSString *name;//姓名
NSString *gender;//性别
NSInteger age;//年龄
NSString *gender;//性别
NSInteger age;//年龄
类的定义
接口部分和文件实现部分都可以写在main.m里 但需要写在main函数的外面 相当于函数的声明和实现 函数与函数之间不可嵌套定义,所以必须在main函数外面
一个文件里可以有很多个类 只要符合 接口文件的声明和实现的框架就可以 和文件名没有关系 一般情况下 一个文件中就定义一个类 类的名字和文件同名
//.m里
@implementation aa
@end
//.h里
@interface aa : NSObject
{
NSString *name;
NSString *sex;
}
@end
//.m里
@implementation aa
@end
//.h里
@interface aa : NSObject
{
NSString *name;
NSString *sex;
}
@end
方法
命名规范 : 工程 所有单词的首字母都要大写
方法 第一个单词首字母不大写 以后所有单词的首字母都大写
//self 谁调用该方法,self就代表谁 可用于对象 也可用于类 当方法是一个减号(-)方法时 调用该方法的对象是谁 self就是当前对象 当方法是一个加号方法(+)时,调用该方法的类是谁 self就代表当前类
加号方法即类方法 只能类使用 不能使用实例变量 实例变量是依托于对象存在的 只有有了对象 实例变量才会有效 比如给人类起个名字 但不知道给那个具体的对象赋名字
加号方法即类方法 只能类使用 不能使用实例变量 实例变量是依托于对象存在的 只有有了对象 实例变量才会有效 比如给人类起个名字 但不知道给那个具体的对象赋名字
unknown type name “women” 意思:不能识别的类型women 解决方案: #import导入头文件时,会将头文件中的内容复制一份,在对象使用women这个类时,该类还未定义,所以识别不了.典型的循环导入问题. 解决方案 :使用该类时不能把它当做一个类来使用,所以在.h文件里使用@Class women;将women声明为一个字符串使用 ,但他不具有类中的内容,需要在.m里面#import “women.h”导入头文件 下面是具体的事例:
.n文件
#import <Foundation/Foundation.h>
@interface Person : NSObject
{//实例变量的存在依托于对象
//NSString 是字符串的类 ( NSString *)表示对象
NSString *_name;//姓名
NSString *_gender;//性别
NSInteger _age;//年龄
}
//类的方法,即函数的声明,不一样的是oc的方法有对对象的和对类的
//打豆豆
+ (void)fight;//针对与类的方法 不能有实例变量
- (void)sayHi;//针对对象的方法.
//设置器方法 以set开头的基本形式如下: 没有返回值 且只有一个参数 作用:为实例变量赋值.
//为name赋值
- (void)setName:(NSString *)name;
//为gender赋值
- (void)setGender:(NSString *)gender;
//为age赋值
- (void)setAge:(NSInteger)age;
//访问器 get方法 没有参数 有返回值 作用:给实例变量获取值
//读取_name的值
- (NSString *)name;
//读取_gender的值
- (NSString *)gender;
//读取_age的值
- (NSInteger)age;
//自定义一个初始化方法 - 标识符 对象方法 + 类方法
- (id)initWhitName:(NSString *)name gender:(NSString *)gender age:(NSInteger)age;//实例方法 又称对象方法
//id OC里面所有的返回类型,相当于 void*
//初始化方法的方法名initWhitName:gender:age:中间不能有空格 冒号不能省略
@end
@interface Student : NSObject
{
NSString *name;
NSString *sex;
}
@end
@interface aa : NSObject
{
NSString *name;
NSString *sex;
}
@end
//一个文件里可以有很多个类 只要符合 接口文件的声明和实现的框架就可以 和文件名没有关系 一般情况下 一个文件中就定义一个类 类的名字和文件同名
@interface Person : NSObject
{//实例变量的存在依托于对象
//NSString 是字符串的类 ( NSString *)表示对象
NSString *_name;//姓名
NSString *_gender;//性别
NSInteger _age;//年龄
}
//类的方法,即函数的声明,不一样的是oc的方法有对对象的和对类的
//打豆豆
+ (void)fight;//针对与类的方法 不能有实例变量
- (void)sayHi;//针对对象的方法.
//设置器方法 以set开头的基本形式如下: 没有返回值 且只有一个参数 作用:为实例变量赋值.
//为name赋值
- (void)setName:(NSString *)name;
//为gender赋值
- (void)setGender:(NSString *)gender;
//为age赋值
- (void)setAge:(NSInteger)age;
//访问器 get方法 没有参数 有返回值 作用:给实例变量获取值
//读取_name的值
- (NSString *)name;
//读取_gender的值
- (NSString *)gender;
//读取_age的值
- (NSInteger)age;
//自定义一个初始化方法 - 标识符 对象方法 + 类方法
- (id)initWhitName:(NSString *)name gender:(NSString *)gender age:(NSInteger)age;//实例方法 又称对象方法
//id OC里面所有的返回类型,相当于 void*
//初始化方法的方法名initWhitName:gender:age:中间不能有空格 冒号不能省略
@end
@interface Student : NSObject
{
NSString *name;
NSString *sex;
}
@end
@interface aa : NSObject
{
NSString *name;
NSString *sex;
}
@end
//一个文件里可以有很多个类 只要符合 接口文件的声明和实现的框架就可以 和文件名没有关系 一般情况下 一个文件中就定义一个类 类的名字和文件同名
.m文件
#import "Person.h"
@implementation Person
//打豆豆
+ (void)fight{
NSLog(@"打豆豆");
}
- (void)sayHi{
NSLog(@"name:%@,gender:%@,age:%ld",_name,_gender,(long)_age);
}
//给name赋值的实现
- (void)setName:(NSString *)name{
_name = name;
}//规范的写法 _name 实例变量前加_ + 变量名
- (void)setGender:(NSString *)gender{
_gender = gender;
}
- (void)setAge:(NSInteger)age{
_age = age ;
}
//读取_name的值
- (NSString *)name{
return _name;
}
- (NSString *)gender{
return _gender;
}
- (NSInteger)age{
return _age;
}
//自定义一个初始化方法
- (id)initWhitName:(NSString *)name gender:(NSString *)gender age:(NSInteger)age{
_name = name;
_gender = gender;
_age = age;
return self;
}
//self 谁调用该方法,self就代表谁 可用于对象 也可用于类
@end
#import "Person.h"
@implementation Person
//打豆豆
+ (void)fight{
NSLog(@"打豆豆");
}
- (void)sayHi{
NSLog(@"name:%@,gender:%@,age:%ld",_name,_gender,(long)_age);
}
//给name赋值的实现
- (void)setName:(NSString *)name{
_name = name;
}//规范的写法 _name 实例变量前加_ + 变量名
- (void)setGender:(NSString *)gender{
_gender = gender;
}
- (void)setAge:(NSInteger)age{
_age = age ;
}
//读取_name的值
- (NSString *)name{
return _name;
}
- (NSString *)gender{
return _gender;
}
- (NSInteger)age{
return _age;
}
//自定义一个初始化方法
- (id)initWhitName:(NSString *)name gender:(NSString *)gender age:(NSInteger)age{
_name = name;
_gender = gender;
_age = age;
return self;
}
//self 谁调用该方法,self就代表谁 可用于对象 也可用于类
@end
main.m文件
#import
<Foundation/Foundation.h>
#import "Person.h"
#import “mobilePhone.h" 头文件的导入
int main( int argc, const char * argv[])
{
@autoreleasepool {
Person *p = [[ Person alloc ] init ]; // 开辟空间 初始化
[p sayHi ]; //对于对象的方法实现
[ Person fight ]; //对于类的方法实现
Person *xiaoMing = [[ Person alloc ] init ]; // 开辟内存 , 并初始化
[xiaoMing setName : @"duke" ]; // 字符串对象 需要 %@ 输出
[xiaoMing setGender : @"female" ];
[xiaoMing setAge : 20 ]; // 就是个简单地变量类型
[xiaoMing sayHi ];
Person *xiaoli = [[ Person alloc ] initWhitName : @"frank" gender : @"m" age : 18 ]; // 调用初始化方法 自定义的
[xiaoli sayHi ];
}
return 0 ;
}
#import "Person.h"
#import “mobilePhone.h" 头文件的导入
int main( int argc, const char * argv[])
{
@autoreleasepool {
Person *p = [[ Person alloc ] init ]; // 开辟空间 初始化
[p sayHi ]; //对于对象的方法实现
[ Person fight ]; //对于类的方法实现
Person *xiaoMing = [[ Person alloc ] init ]; // 开辟内存 , 并初始化
[xiaoMing setName : @"duke" ]; // 字符串对象 需要 %@ 输出
[xiaoMing setGender : @"female" ];
[xiaoMing setAge : 20 ]; // 就是个简单地变量类型
[xiaoMing sayHi ];
Person *xiaoli = [[ Person alloc ] initWhitName : @"frank" gender : @"m" age : 18 ]; // 调用初始化方法 自定义的
[xiaoli sayHi ];
}
return 0 ;
}