1. 程式人生 > >黑馬程式設計師——oc之self的使用

黑馬程式設計師——oc之self的使用

、期待與您交流! ----------

首先我們建立一個學生類:Student類

這個學生類裡有學生的id和學生的姓名name

  1. #import 
  2. @interface  
  3. Student : NSObject{  
  4. //idname 
  5. NSString *id;  
  6. NSString *name;  
  7. }  
  8. @property  
  9. (nonatomic,strong) NSString *id;  
  10. @property  
  11. (nonatomic,strong) NSString *name;  
  12. @end  
  13. 學生類的實現檔案  
  14. #import 
  15. "Student.h"
  16. @implementation  
  17. Student   
  18. @synthesize  
  19. id,name;  
  20. @end  

如果使用上面的方法來定義學生類的屬性的get、set方法的時候,那麼其他類訪問的時候就是:

獲取student的名字通過student.name來獲取,給名字賦值則使用[student

setName:@“eve”]; 其中student是Student類的物件,如果在Student類內部訪問其成員屬性使用[self 
setName:@”evo”], 訪問使用self.name;

上面的方法只是一種,但是很難解釋self該不該使用。請看下面:

我們改寫Student類

  1. #import 
  2. @interface  
  3. Student : NSObject{  
  4. //idname 
  5. NSString *_id;  
  6. NSString *_name;  
  7. }  
  8. @property  
  9. (nonatomic,strong) NSString *id;  
  10. @property  
  11. (nonatomic,strong) NSString *name;  
  12. @end  
  13. .m檔案  
  14. #import 
  15. "Student.h"
  16. @implementation  
  17. Student   
  18. @synthesize  
  19. id = _id;  
  20. @synthesize  
  21. name = _name;  
  22. @end  

可見這樣的寫法我們增加了_id和_name,其中@synthesize也有一定的變化。

如何這個時候使用self.name編譯器就會報錯,這樣就說明了我們通常使用self.name實際使用的是student類name的get方法,同理name的set方法亦是如此。

另外網路上也有人從記憶體管理方面來說明的,我將其剪切出來以供學習:

ViewController.h檔案,使用Student類,程式碼如下:

  1. #import 
  2. @  
  3. class Student;  
  4. @  
  5. interface ViewController : UIViewController{  
  6. Student *_student;  
  7. }  
  8. @property  
  9. (nonatomic, retain) Student *student;  
  10. @end  
  11. ViewController.m檔案,程式碼:  
  12. #import 
  13. "ViewController.h"
  14. #import 
  15. "Student.h"
  16. @implementation  
  17. ViewController  
  18. @synthesize  
  19. student = _student;  
  20. -  
  21. (void)didReceiveMemoryWarning  
  22. {  
  23. [super didReceiveMemoryWarning];  
  24. }  
  25. #pragma 
  26. mark - View lifecycle  
  27. -  
  28. (void)viewDidLoad  
  29. {  
  30. [super viewDidLoad];  
  31. }  
  32. -  
  33. (void) dealloc  
  34. {  
  35. [_student release];  
  36. _student = nil;  
  37. [super dealloc];  
  38. }  
  39. 其它的方法沒有使用到,所以這裡就不在顯示了。  
  40. 在ViewController.m的viewDidLoad方法中建立一個Student類的物件  
  41. Student  
  42. *mystudent = [[Student alloc] init];  
  43. self.student  
  44. = mystudent;  
  45. [mystudent  
  46. release];  

接下來就需要從記憶體角度來分析它們之間的區別了:

1、加self的方式:

  1. Student  
  2. *mystudent = [[Student alloc] init];  //mystudent 物件 
  3. retainCount = 1;  
  4. self.student  
  5. = mystudent; //student 物件 retainCount = 2; 
  6. [mystudent  
  7. release];//student 物件 retainCount = 1; 
  8. retainCount指物件引用計數,student的property  
  9. 是retain 預設使用self.student引用計數+1。  

2、不加self的方式

  1. Student  
  2. *mystudent = [[Student alloc] init];  //mystudent 物件 
  3. retainCount = 1;  
  4. student  
  5. = mystudent; //student 物件 retainCount = 1; 
  6. [mystudent  
  7. release]; //student 物件記憶體已釋放,如果呼叫,會有異常 

3、加self直接賦值方式

self.student = [[Student alloc] init];//student 物件 retainCount =

2;容易造成記憶體洩露

由於objective-c記憶體管理是根據引用計數處理的,當一個物件的引用計數為零時,gcc才會釋放該記憶體

個人總結:只需要在屬性初始化的時候使用self.屬性,其他時候直接使用屬性名就行;使用self.是 使retaincount+1,為了確保當前類對此屬性具有擁有權