iOS何時使用self.

來源:互聯網
上載者:User

大多數的答案是:“這與objc的存取方法有關”

怎麼樣才能有關呢?接下來通過幾個小例子來看一下。

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

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

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

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

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

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

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

我們改寫Student類

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

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

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

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

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

 
  1. #import  
  2. @  
  3. class Student;  
  4.  
  5. @  
  6. interface ViewController : UIViewController{  
  7.  
  8. Student *_student;  
  9. }  
  10.  
  11. @property  
  12. (nonatomic, retain) Student *student;  
  13.  
  14. @end  
  15.  
  16. ViewController.m檔案,代碼:  
  17.  
  18. #import  
  19. "ViewController.h"  
  20. #import  
  21. "Student.h"  
  22.  
  23. @implementation  
  24. ViewController  
  25. @synthesize  
  26. student = _student;  
  27.  
  28. -  
  29. (void)didReceiveMemoryWarning  
  30. {  
  31.  
  32. [super didReceiveMemoryWarning];  
  33. }  
  34.  
  35. #pragma  
  36. mark - View lifecycle  
  37.  
  38. -  
  39. (void)viewDidLoad  
  40. {  
  41.  
  42. [super viewDidLoad];  
  43. }  
  44.  
  45. -  
  46. (void) dealloc  
  47. {  
  48.  
  49. [_student release];  
  50.  
  51. _student = nil;  
  52.  
  53. [super dealloc];  
  54. }  
  55. 其它的方法沒有使用到,所以這裡就不在顯示了。  
  56.  
  57. 在ViewController.m的viewDidLoad方法中建立一個Student類的對象  
  58.  
  59. Student  
  60. *mystudent = [[Student alloc] init];  
  61. self.student  
  62. = mystudent;  
  63. [mystudent  
  64. 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,為了確保當前類對此屬性具有擁有權

個人使用習慣:

 
  1. @interface CustomClass : UIViewController 
  2.     NSString *str 
  3. @property (retain, nonatomic) NSString *str; @implementation CustomClass @synthesize str; -void)viewDidLoad 
  4. { //方法一  用alloc必須手動釋放一次 self.str  =  [[NSString alloc]initWithString:@"my str"]; 
  5.      [str release]; //方法二 用類方法不用 self.str =     [NSString stringWithString:@"my str"]; 
  6.  
  7.     以後調用時直接使用str,不必使用self.str 
  8.    [str appendString:@"\n"]; 
  9. } //在dealloc中必須釋放 - (void)dealloc 
  10. { //方法一  [str release]; 
  11.     str = nil; //方法二 self.str = nil; 
  12.  
  13.     [super dealloc]; 
  14. }  

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.