zoukankan      html  css  js  c++  java
  • OC基础4:类和方法

      "OC基础"这个分类的文章是我在自学Stephen G.Kochan的《Objective-C程序设计第6版》过程中的笔记。

    1、类的声明(@interface)要放在以它自己名字命名的class.h文件中,而类的定义(@implementation)要放在相同名字的class.m文件中;

    2、import本地文件和import系统文件的格式是不同的:导入本地文件要用双引号,导入系统文件要用< 和> ;如下:

       #import <Foundation/Foundation.h>

       #import “calss.h”

    3、程序主要分三个部分:class.h、class.m和main.m,其中:导入系统文件在class.h部分,class.m和main.m只需导入class.h;

    4、关于@property指令和@synthesize指令:

       (1)、可以只用@property指令而不用@synthesize指令,如果不用@synthesize指令的话,@property指令声明的那些实例变量会被自动命名为以“_”开头,最好还是两个都用上;

       (2)、@property指令在interface部分,@synthesize指令在implementation部分;

       (3)、@property指令后面的数据类型不需要括号,如下:

           @property int num;

       (4)、@synthesize指令后不需要跟数据类型,同时有了@synthesize指令后,implementation部分不需要再使用花括号定义这些变量;

       (5)、在interface部分用@property指令声明内容如下:

           @property int xxx;

           相当于:

           @interface XClass: NSObject{

             int xxx;

           }

           -(void) setXxx: (int) n;

           -(int) xxx;

          相当于声明了变量(int) xxx并且声明了两个方法setXxx和xxx。注意set方法前面有set,get方法前面没有get。(所以可以直接用xClass.xxx访问xxx,相当于调用了xxx方法。)

       (6)、在implementation部分用@synthesize指令定义内容如下:

           @synthesize xxx;

           相当于:

           @implementation XClass

           -(void) setXxx: (int) n{

             xxx = n;

           }

           -(int) xxx{

             return xxx;

           }

           相当于把两个函数的实现方法补全,如果没有使用@synthesize指令的话,则编译器会生成以下代码:

          @implementation XClass {

            int _xxx;

          }

           -(void) setXxx: (int) n{

             _xxx = n;

           }

           -(int) xxx{

             return _xxx;

           }              

       (7)、所谓的实例变量会被自动命名为以“_”开头,只是对于@implementation部分而言。在@interface部分和在main函数中,不论是用点运算符访问属性还是用方括号调用setter和getter方法,属性都是没有以“_”开头的。从(6)中第二部分可以看到,setter和getter方法涉及到属性的名字还是用xxx,只有在方法内要使用到具体属性了,才是_xxx。即是说,所谓的以“_”开头的属性,只有在没有定义@synthesize的情况下,在@implementation部分中定义的方法需要访问到的属性才是以“_”开头。其他地方一概视为正常命名。

       (8)、使用@property指令和@synthesize指令定义属性后,如果使用点运算符访问,可以直接用xClass.xxx访问到set方法和get方法;用方括号访问的话,则必须是[xClass setXxx]和[xClass xxx];

    5、关于点运算符和方括号:

       (1)、点运算符一般用在属性上,即是用来设置或取得变量的值,比如:

           aPerson.sex;

       (2)、方括号一般用在方法上,比如:

           [aPerson run];

       (3)、两者可混用,从语法上来讲不算错误,但是最好不要混用;

    6、关于多个参数的方法:

       (1)、方法的声明如下例:

           -(void) setTo: (int) n over: (int) d;

           注意n是形参而over是第二个参数名了;

       (2)、方法的使用如下例:

           [aClass setTo: 1 over: 2];

           照着方法声明时的格式去填参数值,一个一个来;

       (3)、关于(1)中的方法声明,其实参数名over可以省略,变成如下形式:

           -(void) setTo: (int) n : (int) d;

           同样是允许的,但是会使得代码容易混淆,最好不要使用这种风格;

    7、如果一个方法要以某个类的实例作为参数,那么在声明这个方法的时候记得要用上“*”,如下:

       -(void) xxx: (class *) c

    8、实例变量和局部变量:

       (1)、实例变量指在接口部分声明的(或从父类继承来的)变量,实例方法可以直接访问它们的实例变量;

       (2)、作用域限于定义它的程序块之间的变量称为局部变量,比如方法的形参。

    9、关于static关键字:

    (1)、使用static声明过的变量是为静态变量,它的默认值是0;

    (2)、静态变量的值还是可以改变的,static的作用只是让这个变量的值一直保存着;

    (3)、如下,有代码段如下:

        -(int) showPage{

           …

           static int pageCount = 0;

           ++PageCount;

           return PageCount;

           …

    }

           如果这个函数没有static的话,那么每次调用得到的返回值都是1,每次重新调用这个方法,变量的值就会重新分配;使用static之后,第一次调用的返回值是1,第二次是2,以此类推,变量的值会一直存在并累加;

    (4)、(3)的代码段是用来计算页数的,把pageCount设为实例变量和设为局部静态变量的意义是不同的:

           设为实例变量则计算的是某个实例的页数,如果有a和b两个实例,那么a和b的pageCount的值不一定相同;

           设为局部静态变量的话,则pageCount的值等于a和b的页数之和,因为a和b对这个方法的调用都会被pageCount累加起来;

    10、self关键字:相当于this关键字,可以直接调用当前对象;

  • 相关阅读:
    SqlConnectionStringBuilder
    什么时候使用“静态方法”(转)
    Dos命令下多文件中查找某字符串
    StructLayout(LayoutKind.Sequential)(转)
    DOS批处理高级教程:第四章 批处理中的变量(转)
    DOS批处理高级教程:第一章 批处理基础(转)
    C#各种进制之间数据转换二进制、八进制、十进制、十六进制
    DOS批处理高级教程:第六章 if命令讲解(转)
    ModbusRTU模式和结束符(转)
    DOS批处理高级教程:第七章 DOS批处理编程高级技巧(转)
  • 原文地址:https://www.cnblogs.com/shayneyeorg/p/4614546.html
Copyright © 2011-2022 走看看