三种可见度

1.@public

被public 修饰的变量可以在外部(再声明一个新的类,也能访问) 和 该类的内部(在该类的.m文件内部)被访问,这样就可以在 main 函数中访问

@public 一般是不安全的 凡是被@public 修饰的在外部都会被访问 暴露内部写的细节(内部代码的实现)有违背面向对象封装的思想(外部可访问、可修改),所以一般不用这种

2.@ protected

受保护的,只能在该类 和他的子类中可以访问(如在人类的下面的学生类)是实例变量默认的可见度

3.@private

私有的可见度 只能在该类的内部访问(子类也使用不了) 违背了继承的思想

NSObject  类是根类 是基类

总结: 三种可见度(及其区分),为了保护实例对象的封装性,我们有了setter getter 设置器,区分 self 究竟在不同的场景中代表什么?

  1. #import <Foundation/Foundation.h>
  2. #import "Person.h"
  3.  
  4. int main(int argc, const char * argv[]) {
  5. @autoreleasepool {
  6. // insert code here...
  7. NSLog(@"Hello, World!");
  8. //今天的学习内容是:方法 与 可见度
  9. //三大特性:封装 继承 多态
  10. Person *per = [[Person alloc]init];
  11. // per ->_name = @"张俊伟";//前面可见度改为默认的了
  12. // per ->_age = 45;
  13. // per ->_gender = @"男";
  14. // per ->_heigth = 1.75;
  15. // per ->_weight = 125;
  16. [per setName:@"ann"];
  17. NSString * name = [per getName];
  18. NSLog(@"name is %@",name);
  19. [per setAge:];//赋值
  20. [per age];//取值
  21. NSLog(@"%ld",[per age]);
  22. [Person methoodForTest];
  23. [per objectMethood];
  24. [per class];//这里返回的就是 per 指向的类
  25. }
  26. return ;
  27. }

main

  1. #import <Foundation/Foundation.h>
  2.  
  3. @interface Person : NSObject
  4. {
  5. //@public//被public 修饰的变量可以在外部(再声明一个新的类,也能访问) 和 该类的内部(在该类的.m文件内部)被访问,这样就可以在 main 函数中访问
  6. // @ protected 受保护的,只能在该类 和他的子类中可以访问(如在人类的下面的学生类)是实例变量默认的可见度
  7. // @private 私有的可见度 只能在该类的内部访问(子类也使用不了) 违背了继承的思想
  8. // NSObject 类是根类 是基类
  9. //@public 一般是不安全的 凡是被@public 修饰的在外部都会被访问 暴露内部写的细节(内部代码的实现)有违背面向对象封装的思想,所以一般不用这种
  10. NSString *_name;
  11. // NSString *_address;
  12. @protected
  13. NSInteger _age;
  14. CGFloat _heigth;
  15. @private
  16. NSString *_gender;
  17. CGFloat _weight;
  18. }
  19. //为 _name 去赋值 (外面不能访问到 _name 添加一个方法,让外部能够访问)
  20. - (void)setName:(NSString *)name; //设置器 setter方法
  21. // 获取 _name 的值 (取值) //访问器 getter方法
  22. - (NSString *)getName; //规范化写法:getName 改为 name 方法名 就是 实例变量名 那个下划线可以省略
  23. /*
  24. 正是因为我们的可见度是默认的受保护的状态 protected,这样的话我们在外部就无法通过指向操作符去访问到她的实例变量,访问的过程就是取值 赋值 的过程。
  25. 所以我们就为它添加了两个方法,为实例变量去赋值、取值
  26. 设置器:setter 方法 命名规范:set + 实例变量名(首字母大写)
  27. 访问器:getter 方法 命名规则:get + 实例变量名 (或者更为规范的方法 就是直接给出实例变量名)
  28. ( 如果实例变量的名字以下划线 _ 开头一般就是省去 _ )
  29. 通过 setter 方法为实例变量进行赋值操作
  30. 通过 getter 方法来获取实例变量的值
  31. */
  32.  
  33. //为 _age 去赋值
  34. - (void)setAge:(NSInteger)age;
  35. //获取 _age 的值
  36. - (NSInteger)age;
  37. //为 _gender 赋值
  38. - (void)setGender:(NSString *)gender;
  39. //获取 _gender 的值
  40. - (NSString *)gender;
  41. //为 _height 赋值
  42. //- (void)setHeight:()
  43. //获取 _height 的值
  44.  
  45. //为 _weight 赋值
  46.  
  47. //获取 _weight 的值
  48.  
  49. /*
  50. oc 中的方法分为两种
  51. (1)类方法
  52. (2)(对象方法)实例方法
  53. + 对应的是类方法
  54. - 对应的是实例方法 也是对象方法
  55. */
  56. //声明一个类方法 + 开头
  57. + (void)methoodForTest;
  58. + (void)classMethood;
  59. //声明对象方法,就是用 - 开头
  60. - (void)objectMethood;
  61. //一次性为全部的实例变量赋值
  62. - (void)setNameOnce:(NSString *)name
  63. age:(NSInteger)age
  64. gender:(NSString *)gender
  65. height:(CGFloat)height
  66. weight:(CGFloat)weight;
  67. @end

person.h

  1. #import "Person.h"
  2.  
  3. @implementation Person
  4. //为 _name 去赋值 (外面不能访问到 _name 添加一个方法,让外部能够访问)
  5. - (void)setName:(NSString *)name{
  6. _name = name;//将外部的变量赋值给实例变量名
  7. }//设置器 setter方法
  8. // 获取 _name 的值 (取值) //访问器 getter方法
  9. - (NSString *)getName{
  10. return _name;//返回实例变量的值
  11. }
  12. //为 _age 去赋值
  13. - (void)setAge:(NSInteger)age{
  14. _age = age;
  15. }
  16. //获取 _age 的值
  17. - (NSInteger)age{
  18. return _age;
  19. }
  20. //为 _gender 赋值
  21. - (void)setGender:(NSString *)gender{
  22. _gender = gender;
  23. }
  24. //获取 _gender 的值
  25. - (NSString *)gender{
  26. return _gender;
  27. }
  28. + (void)methoodForTest{
  29. //如果有方法,没有实现,那就在 .h 文件里会有警告
  30. //该方法调用 是需要类名去调用
  31. NSLog(@"我是一个好人哦");
  32. }
  33. + (void)classMethood{
  34. //1.直接用类名去调用他的类方法。在类中调用 类方法
  35. // [Person methoodForTest];
  36. //2.用 self 去调用类方法
  37. //self 就是谁调用这个方法(classMethood),那么 self 指代的就是哪个类,此时 self 就是指的 Person 类
  38. [self methoodForTest];
  39. NSLog(@"这是一个类方法");
  40. //在类方法里面调用 对象方法
  41. Person * per = [[Person alloc]init];
  42. //拿对象 per 去调用
  43. [per objectMethood];
  44.  
  45. }
  46. //声明对象方法,就是用 - 开头
  47. - (void)objectMethood{
  48. NSLog(@"这是一个对象方法");
  49. //在一个对象方法里 调用 类方法
  50. [Person classMethood];//直接用类调用
  51. //2.用 self 去获取当前对象的 类
  52. [self class];//对象所对应的类 取出来 // - (Class)class;这是 class 的方法 返回的是类 (这里的 self 指代当前类的对象 [self class] 就是获取 self 所在当前的类)
  53. [[self class]classMethood];// 先看 self 是个什么方法
  54. //在对象方法里获取 实例变量
  55. self -> _age;
  56. //在类方法里能否获取 对象的 实例变量 ????
  57. //不能 获取, 为什么不能获取 ????
  58. //因为 ::类 是抽象的概念,作用 除了描述事物的一个特征,为对象创建空间。对象才是一个具象的。对于类来讲,类是抽象的,不占空间的,通过类 去 alloc 所以对象,只有对象才占空间。
  59. // 实例变量 :是依托对象存在的,所以只有对象存在的前提下,我们的实例变量才有空间。所以说,类方法里不能使用实例变量
  60. //对象要实实在在存在的
  61.  
  62. }
  63.  
  64. //一次性为全部的实例变量赋值
  65. - (void)setNameOnce:(NSString *)name
  66. age:(NSInteger)age
  67. gender:(NSString *)gender
  68. height:(CGFloat)height
  69. weight:(CGFloat)weight{
  70. _name = name;
  71. _age = age;
  72. _gender = gender;
  73. _heigth = height;
  74. _weight = weight;
  75. NSLog(@"%@ %ld %@ %.2f %.2f",name,age,gender,height,weight);
  76. }
  77. @end

person.m

参考

 import 和 include 和 @class  (区别)  

  1. #include #import @class 讲解
  2. #include
  3.         区分 #include <x.h>与#include "x.h"的作用
  4.         #include <x.h>:它用于对系统自带的头文件的引用,编译器会在系统文件目录下去查找该文件.
  5.          #include "x.h":用户自定义的文件用双引号引用,编译器首先会在用户目录下查找,然后到安装目录中查找,最后在系统文件中查找。
  6.  
  7.         在使用#include的时候要注意处理重复引用(这也是objc中#include与#import的区别)
  8.         例如:ClassA ClassB同时引用了ClassC,不做重复引用处理的时候在ClassD中同时引用ClassAClassB编译会提示对ClassC重复引用的错误.
  9.          我们可以:#ifndef _CLASSC_H
  10.                        #define _CLASSC_H
  11.                        #include "ClassC"
  12.                        #endif
  13.          这样处理在编译时就不会有重复引用的错误出现(在objc中#import解决了这个问题,这是它们的区别)
  14.  
  15. #import
  16.          #import 大部分功能和#include是一样的,但是他处理了重复引用的问题,我们在引用文件的时候不用再去自己进行重复引用处理.
  17.  
  18. @class
  19.         主要是用于声明一个类,告诉编译器它后面的名字是一个类的名字,而这个类的定义实现是暂时不用知道的,后面会告诉你.也是因为在@class仅仅只是声明一个类,所以在后面的实现文件里面是需要去#import这个类,这时候才包含了这个被引用的类的所有信息。
  20.  
  21. 综上所述#include,#import@class的区别可以做一下理解:
  22.  
  23.         #include与#import在引用一个类的时候会包含这个类的所有信息包括变量方法等,但是这样做会对编译效率造成影响.比如有100个类都#importClassA,那么在编译的时候这100个类都会去对ClassA处理.又比如AB引用,BC引用,CD引用.....此时如果A被修改,那么后面的BCD.....都需要重新进行编译.还有一个用法会引起编译错误的就是在ClassA中#import ClassB ClassB中#import ClassA那么在编译的时候也会出现未知错误。
  24.         所以一般来说,在interface中引用一个类,就用@class,它会把这个类作为一个类型来使用,而在实现这个interface的文件中,如果需要引用这个类的实体变量或者方法之类的,还是需要import这个在@class中声明的类。

(import 和 include 和 @class 区别)

# import <>  这是导入系统定义的文件

# import " "   这是导入自定义的文件

# include  导入文件

#import   导入文件的是可以避免循环导入(交叉编译)

@class 的作用是:告诉编译器 class 后面的类存在,但是这个类不会被编译  为了避免循环嵌套导入 如果要使用到 类 ,则需要在 .m 文件里导入相对应的类

OC:方法的更多相关文章

  1. JS调用OC方法并传值,OC调用JS方法并传值////////////////////////zz

     iOS开发-基于原生JS与OC方法互相调用并传值(附HTML代码)     最近项目里面有有个商品活动界面,要与web端传值,将用户在网页点击的商品id 传给客户端,也就是js交互,其实再说明白一点 ...

  2. [iOS Hybrid实践:UIWebView中Html中用JS调用OC方法,OC执行JS代码]

    原理: 1.JS调用OC 每次webview执行跳转时都会被iOS给拦截,执行下面函数获得系统允许. 因此可以根据跳转信息转给系统,执行相应功能,比如打开相册等. // 网页中的每一个请求都会被触发 ...

  3. UIWebView中Html中用JS调用OC方法及OC执行JS代码

    HTML代码: <html> <head> <title>HTML中用JS调用OC方法</title> <meta http-equiv=&quo ...

  4. OC方法和文件编译

    OC方法和文件编译 一.OC方法 (一)对象方法 (1)对象方法以-开头如 -(void)xx; (2)对象方法只能又对象来调用 (3)对象方法中可以访问当前对象的成员变量 (4)调用格式   [对象 ...

  5. JS与OC交互,JS中调用OC方法(获取JSContext的方式)

    最近用到JS和OC原生方法调用的问题,查了许多资料都语焉不详,自己记录一下吧,如果有误欢迎联系我指出. JS中调用OC方法有三种方式: 1.通过获取JSContext的方式直接调用OC方法 2.通过继 ...

  6. 转载 -- 基于原生JS与OC方法互相调用并传值(附HTML代码)

    最近项目里面有有个商品活动界面,要与web端传值,将用户在网页点击的商品id 传给客户端,也就是js交互,其实再说明白一点就是方法的互相调用而已. 本文叙述下如何进行原生的JavaScript交互 本 ...

  7. OC方法交换swizzle详细介绍——不再有盲点

    原文链接:https://www.cnblogs.com/mddblog/p/11105450.html 如果对方法交换已经比较熟悉,可以跳过整体介绍,直接看常见问题部分 整体介绍 方法交换是runt ...

  8. iOS JS 交互之利用系统JSContext实现 JS调用OC方法以及Objective-C调用JavaScript方法

    ios js 交互分为两块: 1.oc调用js 这一块实现起来比较简单, 我的项目中加载的是本地的html,js,css,需要注意的是当你向工程中拖入这些文件时,选择拷贝到工程中,(拖入的文件夹是蓝色 ...

  9. iOS JS 交互之利用系统JSContext实现 JS调用oc方法

    ios js 交互分为两块: 1.oc调用js 这一块实现起来比较简单, 我的项目中加载的是本地的html,js,css,需要注意的是当你向工程中拖入这些文件时,选择如下操作,(拖入的文件夹是蓝色的, ...

  10. Runtime 函数 Swizzling 改变OC方法的调度顺序

    首先加入一个小知识: SEL.Method.IMP的含义及区别 在运行时,类(Class)维护了一个消息分发列表来解决消息的正确发送.每一个消息列表的入口是一个方法(Method),这个方法映射了一对 ...

随机推荐

  1. 机器学习(二)——K-均值聚类(K-means)算法

    最近在看<机器学习实战>这本书,因为自己本身很想深入的了解机器学习算法,加之想学python,就在朋友的推荐之下选择了这本书进行学习,在写这篇文章之前对FCM有过一定的了解,所以对K均值算 ...

  2. Heritrix源码分析(四) 各个类说明(转)

    Heritrix的类的确很繁琐,往往继承了一层又一层,最多的继承好像有7层.下面就一个包一个包的说明每个类的作用,由于里面Heritrix组件分明,很多组件没用到的同时该组件的类我也没怎么接触,所以这 ...

  3. 【转】A*寻路算法 C++实现

    头文件:AStarPathFinding #ifndef ASTARPATHFINDING_H #define ASTARPATHFINDING_H #include <queue>//为 ...

  4. 把一个窗体嵌入到WinForm中进行显示,以CMD窗口为例

    1.添加引用 using System.Runtime.InteropServices; 2. 加入以下代码段 [DllImport("User32.dll ", EntryPoi ...

  5. 利用ArcGIS Engine、VS .NET和Windows控件开发GIS应用

    Dixon 原文  用ArcGIS Engine.VS .NET和Windows控件开发GIS应用     此过程说明适合那些使用.NET建立和部署应用的开发者,它描述了使用ArcGIS控件建立和部署 ...

  6. XRPictureBox z

    XRPictureBox 大小加入是40x40  我绑定的图片好比是60X50 , 在不自己写代码的情况下,XRPictureBox 有没有什么属性可以调整,比如像SizeMode那种? // Set ...

  7. delphi 注册表操作(读取、添加、删除、修改)完全手册

    DELPHI VS PASCAL(87)  32位Delphi程序中可利用TRegistry对象来存取注册表文件中的信息. 一.创建和释放TRegistry对象 1.创建TRegistry对象.为了操 ...

  8. 【LeetCode】27 - Remove Element

    Given an array and a value, remove all instances of that value in place and return the new length. T ...

  9. debug 64bit dump of a 32bit process in windows 7 64bit

    In Windows 7 the TaskMgr provides one easy way to create dump for the applications. You can right cl ...

  10. U盘安装RedHat 5.3

    转载自http://www.cnblogs.com/totozlj/archive/2012/06/03/2532757.html 1.下载rhel-5.3-server-i386-dvd.iso文件 ...