2014
Feb
03





這篇文章主要會說明如果寫一個 Class 物件,並多次重複建構使用。

等一下我要建立一個物件,這是一個簡單的 list 清單,透過 add 增加一項新資料,再用 remove 清除一項資料,最後使用 print 印出所有的訊息。

我要先增加一組檔案 header (.h) 與 implement (.m),這裡選擇 「Objective-C class」即可,選好後並命名為 「list 」, Xcode 會自動建立這兩個檔案 list.h 與 list.m 。

Objective-C new class

list.h header

list.h 是 list 這個物件的 header file,我要宣告 list 物件的 propertymethod

  • Property 宣告: @property (strong, nonatomic) NSMutableArray* data;
  • Method 宣告: - (void) add: (NSString *) name
list.h
  1. #import <Foundation/Foundation.h>
  2.  
  3. @interface list : NSObject
  4.  
  5. @property (strong, nonatomic) NSMutableArray* data;
  6.  
  7. - (id) init; //construct
  8. - (void) dealloc; //destruct
  9. - (void) add:(NSString *)name; //add a new data
  10. - (void) remove:(NSString *)name; //remove a data
  11. - (void) print; //print result
  12.  
  13.  
  14. @end

implement class

construct

Obj-C 的 construct 方式是使用 init ,並且要 return self

我在 header 中已經宣告一個 NSMutableArray ,所以 construct 時,我用 alloc 分配 memory 給這個變數。

list.m
  1. - (id) init {
  2. self.data = [[NSMutableArray alloc] init];
  3. return self;
  4. }

Method add

list.m
  1. - (void) add:(NSString *)name {
  2. [self.data addObject:name];
  3. }

Method remove

這個 method 會比對要刪除的字串,當比對成功就刪除。

list.m
  1. - (void) remove:(NSString *)name {
  2. int i;
  3. int n = [self.data count];
  4. for (i = 0; i < n; i++) {
  5. if ([self.data objectAtIndex:i] == name) {
  6. NSLog(@"Remove index = %d",i);
  7. [self.data removeObjectAtIndex:i];
  8. return ;
  9. }
  10. }
  11. }

Method print

print :將 list 中的資料全部印出來。

list.m
  1. - (void) print {
  2. int i;
  3. int n = [self.data count];
  4. for (i = 0; i < n ; i++) {
  5. NSLog(@" name = %@", [self.data objectAtIndex:i]);
  6. }
  7. }

執行 list 的程式碼

上面幾個步驟就把 list 物件寫好了,接著我要在 main.m 中 new list 這個物件來使用。

我新增三項資料 r1, r2, r3,再將 r2 刪除,最後印出結果 r1 與 r3。

main.m
  1. list *t = [[list alloc] init];
  2. [t add:@"r1"];
  3. [t add:@"r2"];
  4. [t add:@"r3"];
  5. [t remove:@"r2"];
  6. [t print];
  7. //Output:
  8. // name = r1
  9. // name = r3

全部的程式碼

list.m
  1. #import "list.h"
  2.  
  3. @implementation list
  4.  
  5. - (id) init {
  6. self.data = [[NSMutableArray alloc] init];
  7. return self;
  8. }
  9.  
  10. - (void) dealloc
  11. {
  12.  
  13. }
  14.  
  15. - (void) add:(NSString *)name {
  16. NSLog(@"add name = %@", name);
  17. [self.data addObject:name];
  18. }
  19.  
  20. - (void) remove:(NSString *)name {
  21. int i;
  22. int n = [self.data count];
  23. for (i = 0; i < n; i++) {
  24. if ([self.data objectAtIndex:i] == name) {
  25. NSLog(@"Remove index = %d",i);
  26. [self.data removeObjectAtIndex:i];
  27. return ;
  28. }
  29. }
  30. }
  31.  
  32.  
  33. - (void) print {
  34. int i;
  35. int n = [self.data count];
  36. for (i = 0; i < n ; i++) {
  37. NSLog(@" name = %@", [self.data objectAtIndex:i]);
  38. }
  39. }
  40.  
  41. @end
main.m
  1. #import "list.h"
  2. int main(int argc, char *argv[])
  3. {
  4. @autoreleasepool {
  5. list *t = [[list alloc] init];
  6. [t add:@"r1"];
  7. [t add:@"r2"];
  8. [t add:@"r3"];
  9. [t remove:@"r2"];
  10. [t print]; // r1 r3
  11. list *t2 = [[list alloc] init];
  12. [t2 add:@"r1"];
  13. [t2 add:@"r2"];
  14. [t2 add:@"r3"];
  15. [t2 remove:@"r1"];
  16. [t2 print]; // r2 r3
  17. return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
  18. }
  19. }

目前回應 Comments(1 comments)

  • Larry 2014/06/12

    Hi,

    Thanks for sharing.
    In the main.m, line 17, the comment should be // r2 r3 instead of // r1 r2.

    Reply

    Admin

    I had already fix this issue.

    Thanks remind me.

回應 (Leave a comment)