oc08--局部变量,全局变量,函数方法的区别

//
//  main.m
//  局部变量和全局变量以及成员变量的区别

#import <Foundation/Foundation.h>
@interface Person : NSObject
{
    // 写在类声明的大括号中的变量, 我们称之为 成员变量(属性, 实例变量)
    // 成员变量只能通过对象来访问
    // 注意: 成员变量不能离开类, 离开类之后就不是成员变量,成员变量不能在定义的同时进行初始化。
    // 存储: 堆(当前对象对应的堆的存储空间中)
    // 存储在堆中的数据, 不会被自动释放, 只能程序员手动释放
    int age;
}
@end
@implementation Person
@end
// 写在函数和大括号外部的变量, 我们称之为全局变量
// 作用域: 从定义的那一行开始, 一直到文件末尾
// 局部变量可以先定义在初始化, 也可以定义的同时初始化
// 存储: 静态区
// 程序一启动就会分配存储空间, 直到程序结束才会释放
int a;
int b = 10;

int main(int argc, const char * argv[]) {
    // 写在函数或者代码块中的变量, 我们称之为局部变量
    // 作用域: 从定义的那一行开始, 一直到遇到大括号或者return
    // 局部变量可以先定义再初始化, 也可以定义的同时初始化
    // 存储 : 栈
    // 存储在栈中的数据有一个特点, 离开作用域,系统会自动给我们释放
    int num = 10;
    {
        int value;
    }
    return 0;
}
//
//  main.m
//  函数和方法的去呗

#import <Foundation/Foundation.h>
/*
 函数和方法的区别
 1.函数属于整个文件, 方法属于某一个类,函数可以直接调用, 方法必须用对象或者类来调用
 注意: 虽然函数属于整个文件(可以写在类的实现中), 但是如果把函数写在类的声明中会不识别。
 3.不能把函数当做方法来调用, 也不能把方法当做函数来调用
 
 方法的注意点:
 >方法可以没有声明只有实现。
 >方法可以只有声明没有实现, 编译不会报错, 但是运行会报错
 如果方法只有声明没有实现, 那么运行时会报: 
 reason: '+[Person demo]: unrecognized selector sent to class 0x100001140'
 发送了一个不能识别的消息, 在Person类中没有+开头的demo方法
 reason: '-[Person test]: unrecognized selector sent to instance 0x100400000'
 
 
 类也有一个注意点:
 类可以只有实现没有声明,实现中加上 : NSObject,,
 注意: 在开发中不建议这样写
 
 */

//@interface Person : NSObject
//// 对象方法声明
//- (void)test;
//// 类方法声明
//+ (void)demo;
//
//@end

@implementation Person : NSObject  //不申明就要加上 : NSObject
// 对象方法实现
- (void)test
{
    NSLog(@"test");
}
// 类方法实现
+ (void)demo
{
    NSLog(@"demo");
}

@end



// 外部函数的声明
extern void sum();
// 内部函数的声明
static void minus();
// 外部函数
extern void sum()
{
    printf("sum");
}
// 内部函数
static void minus()
{
    printf("minus");
}


int main(int argc, const char * argv[]) {
    sum();
    [Person demo];
    demo();
    [Person sum];
    [Person demo];
    Person *p = [Person new];
    [p test];
    
    return 0;
}

 

//
//  main.m
//  常见错误

#import <Foundation/Foundation.h>
@interface Person : NSObject
{
    int _age;
}
- (void)test;
@end
@implementation Person
- (void)test
{
    NSLog(@"test");
}
@end

int main(int argc, const char * argv[]) {
    
    Person *p = [Person new];
    [p test];
    /*
     //    1.只有类的声明,没有类的实现
     //    2.漏了@end
     //    3. @interface和@implementation嵌套
     //    4.成员变量没有写在括号里面
     //    5.方法的声明写在了大括号里面
     //    6.成员变量不能在{}中进行初始化、不能被直接拿出去访问
     //    7.方法不能当做函数一样调用
     //    8.OC方法只能声明在@interface和@end之间,只能实现在@implementation和@end之间。也就是说OC方法不能独立于类存在
     //    9.C函数不属于类,跟类没有联系,C函数只归定义函数的文件所有
     //    10.C函数不能访问OC对象的成员
     //    11.低级错误:方法有声明,但是实现的时候写成了函数
     //    12.OC可以没有@interface同样可以定义一个类
     //    13.static不能用在成员变量和方法上。
     */
    
    return 0;
}

 

posted @ 2017-08-22 13:44  无天666  阅读(817)  评论(0)    收藏  举报