// // 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; }