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
