OC基础知识汇总

这篇博客主要介绍了Objective-C中NSLog的定义及其使用,以及NSArray的基础操作,包括创建、添加、删除、排序等方法。同时,提到了数组的特性以及不同类型的属性设置。
摘要由CSDN通过智能技术生成
OC部分
第一部分   基本概念 
OC概述
OC是一种能够完成复杂面向对象编程的简单的计算机设计语言。
通过提供用于定义类和方法的语法,它扩展了标准的c语言。它还提供了类和接口(任何类采用)的动态扩展。
面向对象编程
1.  面向对象 和 面向过程
面向对象 OOP( Object Oriented Programming ) 分解问题组成的对象 协调对象间的联系和通信 解决问题.  以对象为中心 也就是参数事件的参与者,设计对象的功能完成事件只是事物所有功能中的一小部分.
面向过程 POP (P rocedure Oriented  Programming)  分析解决问题的步骤 实现函数 依次调用.  事件为中心  关心该事件的详细步骤 一步一步如何完成实现.
类和对象
2.   类  只允许单继承 一个类只允许一个父类 没有父类的类称为根类  NSObject 根类 OC里唯一一个没有父类的类
:一组具有 相同特征和行为的事物的抽象集合 。 是一个抽象的概念,在生活中不具体.  静态属性 特征  动态属性 动作
对象:类中具体的。对象是类的实例。类的具体表现.
静态类型化 :可以一眼看出对象属于哪个类;  动态类型化:不可以看出继承与哪个类的对象声明方法
类和对象是面向对象的核心。
三大步骤:定义类 ,创建对象,使用对象。

3.OC中类的定义
面向对象编程中使用对象完成程序
开发中:先定义类 ,在创建对象,然后使用对象。

定义类包含两部分“:接口部分和实现部分。 分开写
1.接口部分:对外声明类的特征和行为 提供外部访问的接口 相当于说明书。 写在 .h文件中 
接口部分标志:@interface  @end
作用: 声明类的实例变量和方法,即特征和方法
包含内容:类名 父类名 实例变量 方法。
(1)以@interface 接口开头  Person 当前类名 :  NSObject  当前类继承的父类
(2)以@end//结束 只有把类的接口定义内容写在开始和结束之间才有效.
(3) People 类名 
(4) : 表示继承 后面表示它有父类 
(5) NSObject 父类名
 
2.实现部分:对内实现行为,相当于功能的实现。 实现部分写在.m文件中
(1)以@implementation开头 以@end结束 实现内容必须写在中间才有效 (2)@implementation后的people是要实现的类(需要指定对哪些类实现)
实现部分标志:@
类和文件
类:@interface...@end 文件 @implemention…@end
文件:.h称为接口文件或者头文件   .m称为实现文件。
默认设置如下:
1.使用类命名文件
2..h文件管理类的接口部分,.m文件管理类的实现部分、
文件和类本质没有关系。为了方便管理实现封装性。
4. 创建对象
创建对象分两步:分配内存空间和初始化
分配内存空间:根据类中声明的 实例变量 为对象分配内存,将所有的实例变量置为默认值0,并返回首地址
初始化:
为对象的实例变量设置初始值。
使用对象
指针存储对象的首地址,代指对象。OC中使用指针代指对象,进行操作。
Person *p =[Person alloc];先执行”=“ 右侧
1.[ person alloc] 返回值是对象的首地址,即对象。
2.p是跟对象同类型的指针变量,存储对象首地址,代指对象。
5.实例变量操作
- (CGFloat)getValuea:(CGFloat)a b:(CGFloat)b  c:(CGFloat)c;

方法只.h文件中声明  没.m文件中定义实现
解决方法 :在.m文件里实现 或者在.h里删掉
OC中方法调用 采用消息发送机制[receiver  message];
[receiver(接收者  (+) 或者 对象(-))  message(消息)];

6.  NSLog的定义

NSLog定义在NSObjCRuntime.h中,如下所示:

void NSLog(NSString *format, …);
基本上,NSLog很像printf,同样会在console中输出显示结果。不同的是,传递进去的格式化字符是NSString的对象,而不是char *这种字符串指针
NSLog可以如下面的方法使用:
NSLog (@"this is a test");
NSLog (@"string is :%@", string);
NSLog (@"x=%d, y=%d", 10, 20);
但是下面的写法是不行的:
int i = 12345;
NSLog( @"%@", i );
原因是, %@需要显示对象,而int i明显不是一个对象,要想正确显示,要写成:
int i = 12345;
NSLog( @"%d", i );
NSLog的格式如下所示:
%@ 对象
%d, %i 整数
%u,%z 无符整形
%f 浮点/双字
%x, %X  二进制整数
%o 八进制整数
%zu size_t
%p 指针
%e 浮点/双字 (科学计算)
%g 浮点/双字
%s C字符
%.*s Pascal字符串
%c 字符
%C unichar
%lld 64位长整数(long long) 
%llu 无符64位长整数
%Lf 64位双字 
7. 类和对象  
 - 对于对象  +对于类 
(id) 类似于C语言中的(void *) 泛指指针的返回地址

8.  实例变量可见度 (了解)
public   公共的共有的      实例变量可以在类的外部和内部操作 访问方式可以通过 :对象 + 指向操作符 + 实例变量 例如: p->name;

protected  受保护的 默认的    实例变量只能在该本类和子类内部操作

private  私有的   实例对象只能在该类内访问,不可以在子类文件以及其他文件中访问.

实例变量定义在.h中 相当于先声明某一变量是某一类型的实例变量.  不设置可见度的时候,为默认的 受保护的 protected 定义方式  
      为什么不声明为@public :1. 外部就可以访问内部以及修改,会影响内部的一个实现,提供外不访问的接口. 2.违背了OC三大面向对象的思想——封装 隐藏内部实现,提供外界访问的借口.
     为什么不声明为@private :1.子文件访问不到,子文件还需另外声明.2.违背oc的继承父类有 子类就可以用

    @public //单独
    
NSString *name;//姓名
    
@private
    
NSString *gender;//性别
    
@protected
    
NSInteger age;//年龄

9.  类的定义
接口部分和文件实现部分可以写在main.m里 但需要写在main函数的外面 相当于函数的声明和实现
一个文件里可以有很多个类 只要符合 接口文件的声明和实现的框架就可以 和文件名没有关系 一般情况下 一个文件中就定义一个类 类的名字和文件同名
//.m
@implementation aa
@end 

//.h
 @interface aa : NSObject
 {
 NSString *name;
 NSString *sex;
 }
 @end

10.  方法
工程 所有单词的首字母都要大写 
方法 第一个不大写 以后所有的首字母都大写
//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 *_name;//姓名
    
NSString *_gender;//性别
    
NSInteger _age;//年龄
}
//类的方法,即函数的声明,不一样的是oc的方法有对对象的和对类的
//打豆豆
+ (
void)fight;//针对与类的方法 不能有实例变量
//sayHi;
- (
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:中间不能有空格 冒号不能省略
//测试函数
+ (
void)test;
@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(@"打豆豆");
}
//sayHi;
- (
void)sayHi{
    
NSLog(@"name:%@,gender:%@,age:%ld",_name,_gender,(long)_age);
}
//name赋值的实现
- (
void)setName:(NSString *)name{
    
_name = name;
}
//规范的写法 _name 实例变量前加_ + 变量名
//gender赋值
- (
void)setGender:(NSString *)gender{
    
_gender = gender;  
}
//age赋值
- (
void)setAge:(NSInteger)age{
    
_age = age ;
}
//读取_name的值
- (
NSString *)name{
    
return _name;
}
//读取_gender的值
- (
NSString *)gender{
    
return _gender;
}
//读取_age的值
- (
NSInteger)age{
    
return _age;
}
//自定义一个初始化方法
- (
id)initWhitName:(NSString *)name gender:(NSString *)gender age:(NSInteger)age{
    
_name  = name;
    
_gender = gender;
    
_age = age;
    
return self;
}
//self 谁调用该方法,self就代表谁 可用于对象 也可用于类
//测试函数

+ (
void)test{
}
@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 ;
}

11 . 继承  
继承的思想:当多个类出现部分相同的实例变量和方法时,就考虑用继承 .
继承的使用:将多各类中相同的实例变量的方法提出来写成一个公共父类.
子类继承父类:会将父类中中除了声明为@private的实例变量以及私有方法之外,其他内容会继承.如果子类中有父类相同的内容,可以全部删除父类继承过来东西就是自己的 不是父类的 相当于拷贝过来一份 可以直接来用
私有方法:在.m中实现,但是没有在.h中声名的方法 不允许外部访问,本类内部可以访问
使用私有方法的方式 [self aa];

12.消息发送机制 [receiver message];  这里receiver可以使类 也可以是对象 如果message是+号方法 这里就是类 如果是- 号方法这里是对象 
13.OC里的id泛指搜友的对象类型 可以用对应的对象类型来接收 
14.创建对象分两步:首先在堆区开辟内存空间,然后对空间对象赋初值 如定义一个Person类 首先[Person alloc];开辟内存空间 然后将变量赋初值操作  Person *per = [[Person allocinitWithName:@"frank" sex:@"man" age:18];
调用方法 [per    sayhi];’[接收者 message];
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值