OC基础知识概念和注意点
发布日期:2021-08-19 11:10:06 浏览次数:17 分类:技术文章

本文共 5184 字,大约阅读时间需要 17 分钟。

------不喜勿喷------

???面向对象的思想

     以对象为主体,强调有拥有这些功能的对象。

     好处:将复杂的事情简单化,更加符合人民的思想,从执行者到指挥者

???对象

     世界万物都是对象

???类

     对具体事物(对象)的抽象。

  确定Object-C是面向象对象的

1、Foundation是一个框架 Foundation.h是框架的主头文件

  import 是include的升级版,可以自动防止重复包含 注意:以后都要使用import

2、printf与NSLog的区别(C和OC输出函数的区别)

     1.名字不同

     2.打印的内容不同 nslog括号里面要以@开头

     3.输出的内容不同

     4.nslog可以自动换行

     5.用于的语言不同

3、类三个部分:

  名字:首字母大写,其他部分遵循驼峰原则  (@interface Phone : NSObject)

      属性: 最好以_开头,其他部分遵循驼峰原则    (int _cpu;)

      行为(功能/方法): 遵循驼峰原则     (-(void)callPhone:(char *)telephone;)

  创建类:类的声明和类的实现两部分  

  @interface 。。。。@end (不可以丢)

  @implementation 。。。。@end

  所有的类都继承于NSObject类 NSObject的作用:使类具有创建对象的能力

  类的属性的声明只能写在{}里面 

4、自动释放池    @autoreleasepool 自动释放内存

5、创建对象

  [Person new]的作用

         1.开辟存储空间保存对象

         2.初始化成员变量(字段,实例变量),数据类型都初始化为0或nil

         3.返回地址

         用Person类型的指针保存Person对象的地址

          person1是局部变量,在

                     对象指针     对象

         Person *person1 = [Person new];//在里面创建了一个对象

         给成员变量赋值与给结构体赋值方法相同  

   一个类可以创建多个对象,对象之间互不影响

注意:在oc当中,方法或者成员变量只能对象指针/类名调用

6、对象方法:

  命名规则:1.以-号开头

       2.所有的数据类型就放在()里面,而且只有数据类型放在()里面

       3.方法名遵循驼峰原则

       4.如果方法没有参数,那方法名后面什么都不用写

  方法类型:1、无参无返回值  2、无参有返回值  3、有参无返回值  4、有参有返回值

    规则:一个参数带着一个:号,:号放在参数类型的前面

注意:1、“”号属于方法名的一部分,-号不是方法名的一部分

   2、在类的内部可以直接访问成员变量

   3、在对象里面有一个隐藏的成员变量叫isa,专门用来指向方法列表

      

7、 常见错误分析:

         1.只写声明,不写实现

         2.声明实现不能嵌套调用

         3.与c函数也不能嵌套

         4.不能丢掉:NSObject

         5.属性只能声明在{}当中

         6.不能在声明里面直接给成员原变量赋值

         7.方法的声明只能写在{}后面,@end前面

         8.方法不能只有声明,没有实现。调用的时候会报经典错误。

         -[Person run]: unrecognized selector sent to instance 0x100202d00 翻译:没有找到对应的方法

         9.没有声明,只有实现,这样可以,但是非常不推荐使用。

          这是oc的弱语法。所以不推荐使用

注意:在一个  .h .m文件当中最好只放一个类的声明与实现

   封装:将实现过程隐藏起来属性私有化,通过公共的方法访问成员变量,就是对对象的封装。

   举例:

   出现脏数据原因:直接给成员变量赋值

        解决办法:1.不让他直接访问  2.过滤数据

        直接赋值:  gun1->_bulletCount = -4;

        通过方法间接赋值  [gun1 addBulletCount:-4];

8、get、set 方法

      // @public  此时权限变成默认的@protected,它的范围包括本类与子类

oc有一个约定:给成员变量赋值set方法

       规则:1.以-号开头  2.方法名以set开头,其他的,首字母大写,其他遵循驼峰原则  3.无返回值  4.有一个参数,参数的类型就是成员变量的类型,参数的名称就是成员变量去掉下滑先后的部分

       get方法 作用:成员变量的

       规则:1.以-开头 2.方法名就是成员变量去掉下滑先后的部分 3.有返回值,返回值类型就是成员变量的类型  4.无参数    

9、类方法

   1、由类名调用

         2、以+开头

         3、类方法可以调用自己的类方法,不能调用对象方法

         4、可以作为工具方法

区分对象方法:当两个方法同名的时候,用前面的+ -号区分

         优点:类方法:效率高,节省内存  缺点:不能使用成员变量

         优点:对象方法:可以使用成员变量

    命名规则:1.以+号开头  2.其他的规则与对象方法同

   5、对象方法与类方法嵌套调用

         对象方法调用自己的对象方法   可以

         对象方法调用自己的类方法    可以

         类方法调用自己的类方法      可以

         类方法调用自己的对象方法    不可以

注意:当类方法和对象方法同名时,他们是两个方法,所以不会报错

10、self --self代表的是类名对象指针  

  问题1:什么时候可以类名或对象指针?  在方法当中进行嵌套调用的时候

    问题2:什么时候代表对象指针,什么时候代表类名?  在对象方法当中调用方法的时候,self代表对象指针

                            在类方法里面调用方法的时候,self代表类名

    问题3:self只能调用方法吗?self在代表类名的时候,只能调用方法,代表对象指针的时候可以调用成员变量

注意:自己调用自己会造成死循环,一定要加以注意。

    //所谓的私有方法就是方法没有声明,只有实现。但是记住oc当中没有真正的私有方法。

   作用:辅助本类的其他方法

 11、点语法

    1.直接赋值  //girl1->_age = 20;

    2.通过set,get方法间接赋值  // [girl1 setAge:20];

    3.通过点语法,点语法实际上只能是get,set方法(用点语法不能调用其他方法)  //girl1.age = 20;

      ???那里使用set,那里使用get        //当在=左边出现的时候,代表set,其他的地方代表get

12、property(合成存储器/属性生成器)

  property 作用:专门用来生成成员变量的get,set方法的声明

  格式:@property + 成员变量类型 + 成员变量去掉下滑线后的部分

  @property int age;

  synthesize  作用:自动生成成员变量的实现部分

    格式:@synthesize + 成员变量去掉下划线后的部分 = 成员变量

  @synthesize age = _age;

property加强

xcode4.5之前,@property只能生成成员变量的声明部分,在4.5之后可以同时自动生成声明部分和实现部分和一个成员变量

注意:1.通过@property自定生成的成员变量是完全私有化的,只能在本类中使用

       2.要想在类的外部使用成员变量就要手动生成

  @property的修饰词(√√√√√

   位置:@property 后面的()当中

   分类:assign,copy,retain,weak,strong,setter,getter,nonatomic,atomic,readonly,readwrite

      1.与线程安全有关 nonatomic,atomic  (注意:以后都写nonatomic)

      2.与内存管理有关  ARC(自动内存管理)   (weak,strong)修饰对象,(assign)修饰简单数据类型

                        非ARC(手动内存管理) (copy retain)修饰对象,assign

      3.与权限  readonly,readwrite(默认)

      4.自定义set,get方法  setter,getter

      copy当修饰对象时,只能修饰字符串对象

13、继承(父与子的关系)

  当子类与父类当中有同名的方法(同参数,同返回值,同方法名)的时候,这种现象叫方法的重写,子类的方法会覆盖父类的同名方法

 方法的执行顺序:优先执行子类的方法

   作用:当子类的同名方法中想要在有父类的功能的同时有自己的功能

   super:代表父类的对象指针或类名

   在打印对象的时候,格式符是%@,在打印时调用的是description方法

    description类的描述方法,作用是打印对象的一些描述信息

          作用:就是当对象的属性很多时,需要打印,,就重写description方法

  类与类之间的关系:组合(一个类作为另一个类的成员变量),继承,传参

14、多态(一种事物的多种形态)

  简单的说就是:父类调用子类的方法;

  当用父类的对象指针指向子类的对象,在编译阶段是计算机是不会识别对象的,在运行阶段才会真正的调用方法,这叫动态绑定。当运行的时候也会识别对象也就会报错;

        Animale *animal1 = [Dog new];

   animal1指向的是一个Dog的对象,所以要调用Dog的方法,这种情况下只有将Animal的指针转化为Dog的指针,才能调用Dog的对象方法。   

  1、 [(Dog *)animal1 bark];(√√√√

  2、使用id

    id 是一种数据类型,可以代表任意类型(这些数据类型,必须是对象),又称为万能指针  同时也是一个关键字    

   NSObject *obje = [Person new];

        [(Person *)obje feedAnimal:cat];

        

        id myId=[Person new];  //使用id时不用强制转化

        [myId feedAnimal:cat];

15、构造方法

   Dog *dog1 = [[Dog alloc] init];

     ???? 为什么要用alloc + init 代替new  因为我们想在对象初始化(init)的时候给属性赋值

 

  重写的父类的init方法  self = [super init];

  原先:对父类的属性的初始化,对自己属性的初始化

  增加功能:给自己的成员变量赋值  _age = 56;

 

  //构造方法 ,init方法属于构造方法

  //构造方法家族:注意:方法名必须符合驼峰原则

  举例:

  -(Person *)initWithAge:(int)age{

      self = [super init];

       if (self != nil) {

          _age = age;}

    return self;}

注意:如果将get,set方法的实现部分都重写了,property自动生成的成员变量就失效了。所以,只写一个才会保留property声明的成员变量

 

下面是C的一个题目(不用看

//C二级指针  返回一个指针数组  

#include <stdio.h>

#include <string.h>

#include <stdlib.h>

char ** test(char *str);

#define N 1024

int main(void)

{

int i=0;

char str[N];

while((str[i]=getchar())!='\n')i++;

str[i]='\0';

char **ch=test(str);

 for(i=0;ch[i]!='\0';i++)

    { printf("%s\n",ch[i]); }

return 0;

}

char **test(char *str){

char **ch=(char **)malloc(sizeof(char *)*10);

int i=0;

char *p=(char *)str;

while(1){

p=strtok(p," ");

if(!p){

break;}else{

ch[i++]=p;

p=NULL;}}

  return ch;

}

转载于:https://www.cnblogs.com/wscd/p/4131227.html

转载地址:https://blog.csdn.net/weixin_30924087/article/details/96997670 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:/etc/shadow,/etc/passwd,/etc/shadow,/etc/passwd文件的内容解释
下一篇:得到父类的私有属性

发表评论

最新留言

留言是一种美德,欢迎回访!
[***.207.175.100]2024年04月18日 11时18分20秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章

C++_类和对象_对象特性_构造函数的分类以及调用---C++语言工作笔记041 2019-04-26
C++_类和对象_对象特性_拷贝构造函数调用时机---C++语言工作笔记042 2019-04-26
C++_类和对象_对象特性_构造函数调用规则---C++语言工作笔记043 2019-04-26
C++_类和对象_对象特性_深拷贝与浅拷贝---C++语言工作笔记044 2019-04-26
AndroidStudio_java.util.ConcurrentModificationException---Android原生开发工作笔记237 2019-04-26
AndroidStudio_android中实现对properties文件的读写操作_不把properties文件放在assets文件夹中_支持读写---Android原生开发工作笔记238 2019-04-26
弹框没反应使用Looper解决_the caller should invoke Looper.prepare() and Looper.loop()---Android原生开发工作笔记239 2019-04-26
Command line is too long. Shorten command line for Application---微服务升级_SpringCloud Alibaba工作笔记0067 2019-04-26
AndroidStudio_android实现双击_3击_监听实现---Android原生开发工作笔记240 2019-04-26
C++_类和对象_对象特性_初始化列表---C++语言工作笔记045 2019-04-26
AndroidStudio安卓原生开发_UI高级_DrawerLayout_侧滑菜单控件---Android原生开发工作笔记120 2019-04-26
AndroidStudio安卓原生开发_UI高级_Shape的使用_虚线_直线_矩形_渐变_径向渐变_线性渐变_扫描渐变---Android原生开发工作笔记122 2019-04-26
AndroidStudio安卓原生开发_UI高级_StateListDrawable状态选择器_按钮按下和抬起显示不同颜色---Android原生开发工作笔记124 2019-04-26
kivy制作安卓APP--简单音乐播放器 2019-04-26
十年(程序员改编) 2019-04-26
c++排序算法个人总结 2019-04-26
看完你就知道的乐观锁和悲观锁 2019-04-26
Docker入门 2019-04-26
Spring Aop 扫盲 2019-04-26
看完这篇操作系统,和面试官扯皮就没问题了 2019-04-26