黑马程序员--Objective-C类方法与对象方法、区别、与调用-我之见解

------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------

类方法.

1. 特点:

以加号( + )开头,

调用格式:  [类名  方法名]

类方法的好处:不需要创建实例对象,直 接通过类名访问,节省空间 ,提高了效率

2.注意事项:

类方法可以和实例方法同名, 相互之间互不影响

类方法可以从父类继承而来,子类可以重写类方法 // ,如description类方法

类方法和实例方法一样在interface里声明, 在implementation里实现。

类方法由类名调用,  实例方法由对象调用。

在类方法里使用了self, self指代的是调用者类

在类方法中不能使用类的成员变量

类方法和对象方法之间不能使用self 相互调用

总结self : 谁调用当前方法, self就代表谁

3.对象方法中可以调用其他对象方法

1)当前对象方法中创建对象(可以是当前类的实例对象,也可以是其他类的实例对象),使用新创建的对象调用方法

2)可以使用self

3)对象作为方法的参数传递过来,可以使用传递过来的对象调用方法

4.在类方法中可以调用其他类的方法

1)可以直接使用类名(或者其他类名)调用类方法

2)可以使用self

5) 在类方法中可以调用对象方法

1)对象作为方法的参数传递过来

2)可以创建一个对象

6.类方法和对象方法的比较

对象方法以减号开头, 可以使用成员变量

类方法以加号开头,不能使用成员变量

7.类方法使用场景

如果我们调用一个方法,该方法中不需要使用成员变量,那么我们可以将该方法声明为类方法

以下代码是对上述部分知识点的验证

main.m

#import <Foundation/Foundation.h>
#import "Dog.h"

int main(int argc, const char * argv[]) {
    @autoreleasepool {

        // 1. 通过类名调用eat类方法
        [Dog eat];

        // 2. 调用jump类方法
        Dog *dog = [Dog new];
        [Dog jump:dog];

//        [dog bark];

    }
    return 0;
}

Dog.h

#import <Foundation/Foundation.h>

@interface Dog : NSObject
//类方法和实例方法一样在interface里声明。
+(void)eat;

+(void)run;

+(void)jump:(Dog *)dogDog;

-(void)bark;

-(void)sleep;

@end

Dog.m
#import "Dog.h"

@implementation Dog
+(void)eat//类方法和对象方法一样在@implemention中实现
{
    NSLog(@"狗正在吃");
    // 1.类方法里调用类方法 通过类名调用
//    [Dog run];

    // 2. 类方法里调用类方法 通过self
    [self run];
}

+(void)run
{
    NSLog(@"狗跑了");
}

+(void)jump:(Dog *)dogDog
{
    NSLog(@"狗狗在跳");
    [dogDog bark];//类方法里调用对象方法 对象作为方法的参数传递过来

}

-(void)bark
{
    NSLog(@"狗在叫");

    // 1. 调用的类方法
//    [Dog run];

    // 2. 调用对象方法 自己调用自己陷入死循环
//    [self  bark];
}

-(void)sleep
{
    NSLog(@"狗玩累了,要睡觉了");
}
@end

函数和对象方法的区别

-(void)run;

(1)对象方法的实现在@[email protected]中

对象方法的声明只能写在 @[email protected]中间

(2)对象方法都以-号开头

(3)对象方法只能由对象来调用

(4)函数属于整个文件,可以写在文件中的任何位置,包括@[email protected]中,但写在 @[email protected]会无法识别,函数的声明可以在main函数内部也可以在main函数外部。

(5)对象方法归对象所有

函数: void run(){

}

(1)所有的函数都是平行的

(2)函数不存在隶属关系

(3)使用的时候可以直接调用

(4)不可以访问对象中的成员变量

对象和方法之间的关系

(1),对象作为方法的参数

-(void) displayPerson:(Person *)person{

    NSLog("姓名:%@",person->name);

}

(2),对象作为方法的返回值

-(Person *)changePerson:(Person *)person{

    person->name = @"唐僧";

    return person;

}
时间: 2024-07-31 19:12:31

黑马程序员--Objective-C类方法与对象方法、区别、与调用-我之见解的相关文章

黑马程序员——Java基础篇之对象归要

1.static关键字 1.1.static可以修饰成员变量,成员方法,还有类(其中这里的类是内部类) 1.2.static修饰的部分会随着类的加载而加载: 加载过程:当JVM执行static修饰的代码时,会在内存的共享区给static部分开辟一个空间,供该类持有,static部分不是某个对象的部分,而是该类共有的,所以当一个函数会被多个对象调用时,最好定义成static,这样比较节省空间. 1.3.静态方法只能访问静态成员 原因:如果静态方法中调用了非静态的变量,那么由于静态方法是随着类的加载

黑马程序员——OC语言类方法与self关键字

一)对象方法与类方法的对比 对象方法 1> 减号 - 开头 2> 只能由对象来调用 3> 对象方法中能访问当前对象的成员变量(实例变量) 类方法 1> 加号 + 开头 2> 只能由类(名)来调用 3> 类方法中不能访问成员变量(实例变量) 类方法的好处和使用场合 1> 不依赖于对象,执行效率高 2> 能用类方法,尽量用类方法 3> 场合:当方法内部不需要使用到成员变量时,就可以改为类方法 二)self self的用途: 1> 谁调用了当前方法,s

黑马程序员---OC基础2【对象储存】【函数和方法的区别】【方法和对象关系】【对象作为方法参数】【NSString类介绍】

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- [对象储存] 1.对象的储存细节 [Car  new] new做了3件事 1)向计算机申请存储空间 2)给类中的每一个成员初始化值 3)返回新申请的空间的首地址 (1).申请的空间在内存的哪个区? new 的时候申请的空间内存的堆区(程序动态分配的内存空间) 当new内存的布局: 初始化的时候: 如果实例变量是基本数据类型,此时给初始为0, 如果是字符串类型此时初始化为null (2).实例变

黑马程序员 08-OC的类方法

OC中的方法分为对象方法和类方法,这里介绍类方法. 1.类方法 规则:1.以加号 + 开头; 2.所有数据类型(返回值.参数)都必须写在小括号()里面,而且只有数据类型可以写在小括号()里面; 3.方法名遵循驼峰原则; 4.如果没有参数,方法名后面什么都不写,例如 + (void)lookMyPhone; 5.一个参数对应一个冒号:,冒号:也是方法名的一部分; 例如:+ (void)sendMessage:(char *)message withPhoneNumber:(char *)numbe

黑马程序员--多线程同步的一层对象/二层对象/三层对象写法对比

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 前言: 在面向对象的思想下,线程的写法根据要创建的对象层级可以分为三种写法: 1,一层对象写法:采用extends Thread,复写父类的run()方法,直接建立一个线程实例对象的方式,这种方式简单,适用于单任务的单线程需求.在此不做过多讨论; 2,二层对象写法:采用implements Runnable接口,复写接口的run()方法,得到二级对象--通常称为任务对象;再通过将二级对象传入(

黑马程序员——java——Date类的常见方法演示

Date 中的常用方法演示 import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; public class DateDemos { public static void main(String[] args) throws Exception { // 获取系统当前的时间的毫秒值 long l = System.

黑马程序员——Hashtable,HashMap,TreeMap的区别

Hashtable : 此类实现一个哈希表,该哈希表将键映射到相应的值,任何非null  对象都可以作键值,是线程不同步的 HashMap : 基于哈希表的Map接口的实现,此实现提供所有可选的映射操作并允许使用null值各null键., TreeMap : 底层是二叉树结构,线程不同步,对键进行了排序 版权声明:本文为博主原创文章,未经博主允许不得转载.

黑马程序员---ArrayList、Vector、LinkedList的区别及其优缺点?

------- android培训.java培训.期待与您交流! ---------- 一.同步性 ArrayList,LinkedList是不同步的,而Vestor是同步的.所以如果不要求线程安全的话,可以使用ArrayList或LinkedList,可以节省为同步而耗费的开销.但在多线程的情况下,有时候就不得不使用Vector了.当然,也可以通过一些办法包装ArrayList,LinkedList,使他们也达到同步,但效率可能会有所降低. 二.可变性 从内部实现机制来讲ArrayList和V

黑马程序员—— String,StringBuffer与StringBuilder的区别

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- String 字符串常量 StringBuffer 字符串变量(线程安全) StringBuilder 字符串变量(非线程安全) 简要的说, String 类型和 StringBuffer 类型的主要性能区别其实在于 String 是不可变的对象, 因此在每次对 String 类型进行改变的时候其实都等同于生成了一个新的 String 对象,然后将指针指向新的 String 对象,所以经常改变

黑马程序员——java基础 ArrayList集合基本方法演示

java基础 ArrayList集合基本方法演示 import java.util.ArrayList; import java.util.Iterator; public class ArrayListDemos { public static void main(String[] args) { // 创建一个新的容器 ArrayList al = new ArrayList(); al.add("abc1"); al.add("abc2"); al.add(&