OC语言02

来源:互联网 发布:nvidia控制面板优化 编辑:程序博客网 时间:2024/05/16 01:34
 类和对象  
 - 对于对象  +对于类 
(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;//年龄

@public //整体 作用范围为整体.
   NSString *name;//姓名
    
NSString *gender;//性别
    
NSInteger age;//年龄

类的定义
接口部分和文件实现部分都可以写在main.m里 但需要写在main函数的外面 相当于函数的声明和实现 函数与函数之间不可嵌套定义,所以必须在main函数外面
一个文件里可以有很多个类 只要符合 接口文件的声明和实现的框架就可以 和文件名没有关系 一般情况下 一个文件中就定义一个类 类的名字和文件同名
//.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
//一个文件里可以有很多个类 只要符合 接口文件的声明和实现的框架就可以 和文件名没有关系 一般情况下 一个文件中就定义一个类 类的名字和文件同名
.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
main.m文件
#import <Foundation/Foundation.h>
#import 
"Person.h"
#import 
“mobilePhone.h" 头文件的导入

int main(int argc, const char * argv[])
{
    
@autoreleasepool {
        
Person *p = [[Person allocinit];//开辟空间 初始化
        [p 
sayHi];//对于对象的方法实现
        [
Person fight];//对于类的方法实现
        
Person *xiaoMing = [[Person allocinit];//开辟内存,并初始化
        [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;
}













0 0
原创粉丝点击