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)