zoukankan      html  css  js  c++  java
  • Objective-C 快速入门--基础(一)

    1、实例变量的可见度有哪些?对访问变量有什么影响?

    所谓的内部,指的是相应类的@implementation和@end之间

    示例:

    @interface Person : NSObject

    {

      @public

      NSString *_hobby;   //兴趣!

      @protected

      NSString *_name;   //姓名

      int _age;        //年龄!

      @private

      NSString *_sex; //性别

    }

    2、如果对于一个类Person来说,类中的实例变量_name,可见度设为受保护的.那我如何在本类及其子类以外的地方给_name赋值和取值呢?

      使用setter和getter方法,示例:

      .h中:

      

      .m中:

      

    main.m中:

      

    控制台输出:

      

    3、OC中方法的类型有哪些?每种类型的方法各有什么特点?

      OC中的方法有两种:①类方法②实例方法

      ①   类方法:只能类使用,例如:+(id)alloc ;注意:类方法中不能使用实例变量;

      ②   实例方法:只能对对象使用,例如:-(void)sayHi;

    4、什么时候使用类方法?类方法和实例方法的优缺点是什么?

      ①类方法(+)应该是对整个模型层面的操作;②实例方法(-)是对某单个模型的操作。

      例如:有一个朋友圈类,发布朋友圈或者加载我的朋友圈应该是封装成类方法,对某一条朋友圈评论或赞应该封装成实例方法。

         又如有一个用户类,请求附近的用户,应该写成类方法,更新当前用户的资料,应该写成实例方法。

    5、对于OC中的一个方法 – (void)initWithName: (NSString *)name Age: (int)age Sex: (NSString *)sex;它的什么类型的方法?函数名是什么?有几个参数?返回值是什么类型?

      ①实例方法;②函数名是:initWithName:  Age:  Sex;③有3个参数;④返回值是void类型;

    6、#include,#import,@class各有什么作用?

    (1)#include:

      区分 #include <x.h>与#include "x.h"的作用:

      #include <x.h>:它用于对系统自带的头文件的引用,编译器会在系统文件目录下去查找该文件。

      #include "x.h":用户自定义的文件用双引号引用,编译器首先会在用户目录下查找,然后到安装目录中查找,最后在系统文件中查找。

      在使用#include的时候要注意处理重复引用(这也是objc中#include与#import的区别);

      例如:ClassA 与 ClassB同时引用了ClassC,不做重复引用处理的时候在ClassD中同时引用ClassA,ClassB编译会提示对ClassC重复引用的错误.

      我们可以:#ifndef _CLASSC_H

                      #define _CLASSC_H

                      #include "ClassC"

                      #endif

       这样处理在编译时就不会有重复引用的错误出现(在objc中#import解决了这个问题,这是它们的区别)

    (2)#import:

      #import 大部分功能和#include是一样的,但是他处理了重复引用的问题,我们在引用文件的时候不用再去自己进行重复引用处理.

    (3)@class:

      主要是用于声明一个类,告诉编译器它后面的名字是一个类的名字,而这个类的定义实现是暂时不用知道的,后面会告诉你.也是因为在@class仅仅只是声明一个类,所以在后面的实现文件里面是需要去#import这个类,这时候才包含了这个被引用的类的所有信息

    ※综上所述#include,#import与@class的区别可以做一下理解:

      #include与#import在引用一个类的时候会包含这个类的所有信息包括变量方法等,但是这样做会对编译效率造成影响.比如有100个类都#import了ClassA,那么在编译的时候这100个类都会去对ClassA处理.又比如A被B引用,B被C引用,C被D引用.....此时如果A被修改,那么后面的B,C,D.....都需要重新进行编译.还有一个用法会引起编译错误的就是在ClassA中#import ClassB 在ClassB中#import ClassA那么在编译的时候也会出现未知错误。

      所以一般来说,在interface中引用一个类,就用@class,它会把这个类作为一个类型来使用,而在实现这个interface的文件中,如果需要引用这个类的实体变量或者方法之类的,还是需要import这个在@class中声明的类。

    7、什么时候会造成循环导入?请举例:

      当有两个同时继承于NSObject的类(如:Man和Woman这两个类同时继承与NSObject),现在在Man这个类中要导入Woman实例变量,同时Woman这个类要导入Man这个实例变量,并且导入时使用#import,这个时候就会造成循环导入现象,处理方式是在其中一个类中使用@class;举例如下:

      ①新建一个继承于NSObject的Woman类:

      

    ②再新建一个继承于NSObject的Man类:

      

    @dingding3w@126.com

  • 相关阅读:
    LightOJ 1132 Summing up Powers(矩阵快速幂)
    hdu 3804 Query on a tree (树链剖分+线段树)
    LightOJ 1052 String Growth && uva 12045 Fun with Strings (矩阵快速幂)
    uva 12304 2D Geometry 110 in 1! (Geometry)
    LA 3263 That Nice Euler Circuit (2D Geometry)
    2013 SCAUCPC Summary
    poj 3321 Apple Tree (Binary Index Tree)
    uva 11796 Dog Distance (几何+模拟)
    uva 11178 Morley's Theorem (2D Geometry)
    动手动脑
  • 原文地址:https://www.cnblogs.com/dingding3w/p/4603183.html
Copyright © 2011-2022 走看看