oc08--局部变量,全局变量,函数方法的区别
//
// main.m
// 局部变量和全局变量以及成员变量的区别 #import <Foundation/Foundation.h>
@interface Person : NSObject
{
// 写在类声明的大括号中的变量, 我们称之为 成员变量(属性, 实例变量)
// 成员变量只能通过对象来访问
// 注意: 成员变量不能离开类, 离开类之后就不是成员变量,成员变量不能在定义的同时进行初始化。
// 存储: 堆(当前对象对应的堆的存储空间中)
// 存储在堆中的数据, 不会被自动释放, 只能程序员手动释放
int age;
}
@end
@implementation Person
@end
// 写在函数和大括号外部的变量, 我们称之为全局变量
// 作用域: 从定义的那一行开始, 一直到文件末尾
// 局部变量可以先定义在初始化, 也可以定义的同时初始化
// 存储: 静态区
// 程序一启动就会分配存储空间, 直到程序结束才会释放
int a;
int b = ; int main(int argc, const char * argv[]) {
// 写在函数或者代码块中的变量, 我们称之为局部变量
// 作用域: 从定义的那一行开始, 一直到遇到大括号或者return
// 局部变量可以先定义再初始化, 也可以定义的同时初始化
// 存储 : 栈
// 存储在栈中的数据有一个特点, 离开作用域,系统会自动给我们释放
int num = ;
{
int value;
}
return ;
}
//
// 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 ;
}
//
// 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 ;
}
oc08--局部变量,全局变量,函数方法的区别的更多相关文章
- static全局变量与普通的全局变量有什么区别?static局部变量和普通局部变量有什么区别?static函数与普通函数有什么区别?
答案:全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量.全局变量本身就是静态存储方式,静态全局变量当然也是静态存储方式. 这两者在存储方式上并无不同.这两者的区别虽在于非静态全 ...
- C/C++定义全局变量/常量几种方法的区别
在讨论全局变量之前我们先要明白几个基本的概念: 1. 编译单元(模块): 在IDE开发工具大行其道的今天,对于编译的一些概念很多人已经不再清楚了,很多程序员最怕的就是处理连接错误(LINK ER ...
- C++定义全局变量/常量几种方法的区别
在讨论全局变量之前我们先要明白几个基本的概念: 1. 编译单元(模块): 在IDE开发工具大行其道的今天,对于编译的一些概念很多人已经不再清楚了,很多程序员最怕的就是处理连接错误(LINK ER ...
- 定义c/c++全局变量/常量几种方法的区别(转载)
出自:http://www.cnblogs.com/yaozhongxiao/archive/2010/08/08/1795338.html 在讨论全局变量之前我们先要明白几个基本的概念: 1. 编 ...
- 定义c/c++全局变量/常量几种方法的区别
转自:http://www.cnblogs.com/yaozhongxiao/archive/2010/08/08/1795338.html 1. 编译单元(模块): 在ide开发工具大行其道的今天, ...
- Static全局变量(函数)与普通的全局变量(函数)的区别
转自:http://www.cnblogs.com/zjvskn/p/5548879.html Static全局变量与普通的全局变量有什么区别? 答: 全局变量(外部变量)的说明之前再冠以static ...
- Static全局变量与普通的全局变量有什么区别?static函数与普通函数有什么区别?
Static全局变量与普通的全局变量有什么区别? 答: 全局变量(外部变量)的说明之前再冠以static就构成了静态的全局变量.全局变量本身就是静态存储方式,静态全局变量当然也是静态存储方式. 这两者 ...
- Python之路Python全局变量与局部变量、函数多层嵌套、函数递归
Python之路Python全局变量与局部变量.函数多层嵌套.函数递归 一.局部变量与全局变量 1.在子程序中定义的变量称为局部变量,在程序的一开始定义的变量称为全局变量.全局变量作用域是整个程序,局 ...
- 李洪强iOS开发之OC[017]函数和方法的区别
// // main.m // 15 - 函数和对象的方法的区别 // // Created by vic fan on 16/7/12. // Copyright © 2016年 李洪强. ...
随机推荐
- C - Tram
Problem description Linear Kingdom has exactly one tram line. It has n stops, numbered from 1 to n i ...
- 好用的Cache辅助工具类
话不多说,直接上代码 using System; using System.Collections.Generic; using System.Linq; using System.Text; usi ...
- 大白话理解箭头函数this
var obj1={ num:4, fn:function(){ num:5; var f=() => { num:6; console.log(this.num); //4 外层非箭头函数包裹 ...
- SLAM:ORB-SLAM 位姿优化描述
只知道算法描述和代码,而不知道原理是比较扯的事情,还是把原理转载一下. 原文链接: http://www.cnblogs.com/luyb/p/5447497.html ORB-SLAM作为单目SLA ...
- mysql 是如何保证在高并发的情况下autoincrement关键字修饰的列不会出现重复
转载自 https://juejin.im/book/5bffcbc9f265da614b11b731/section/5c42cf94e51d45524861122d#heading-8 mysql ...
- Java JPA通过hql语句查询数据
import javax.persistence.PersistenceContext; import javax.persistence.Query; public class StudentSer ...
- mint-ui 取值
//slots:[{values: ['年假', '事假', '病假', '婚假', '其他']}], slots:[{values: []}], onValuesChange(picker,valu ...
- 定位IO瓶颈的方法,iowait低,IO就没有到瓶颈?
通过分析mpstat的iowait和iostat的util%,判断IO瓶颈 IO瓶颈往往是我们可能会忽略的地方(我们常会看top.free.netstat等等,但经常会忽略IO的负载情况),今天给大家 ...
- dmidecode输出详解
一.先来看几个用dmidecode查看内存信息的例子. 1.查看内存槽数.那个槽位插了内存,大小是多少 [root@jiangyi01.sqa.zmf /home/ahao.mah] #dmideco ...
- 创建对象—从es5到es6
原文地址 本文主要讲述了使用JavaScript创建对象的几种方式,分别是传统的Object构造函数.对象字面量.工厂模式.构造函数模式.原型模式.组合模式,以及es6的class定义类.然后从bab ...