Objective-C中自定义类的问题

时间:2011-06-22 06:00:00

标签: objective-c cocoa-touch

我目前正在处理的应用程序有点问题。我创建了一个最简单的项目来说明我的问题。

所以,我创建了一个“Navigate-Base应用程序”。我添加了另一个名为TableViewController的UITableViewController(使用该项目创建的那个名为RootViewController)。当我触摸RootViewController中的一行时,我创建了一个TableViewController实例。

我创建了一个名为“MyCustomClass”的自定义类。

MyCustomClass.h(完整代码):

#import <Foundation/Foundation.h>

@interface MyCustomClass : NSObject {
    NSString *name;
}

@property (nonatomic, retain) NSString * name;

@end

MyCustomClass.m(完整代码):

#import "MyCustomClass.h"

@implementation MyCustomClass

@dynamic name;

@end

我在TableViewController类中有一个MyCustomClass attibute。

TableViewController.h(完整代码):

#import <UIKit/UIKit.h>
#import "MyCustomClass.h"

@interface TableViewController : UITableViewController {
    MyCustomClass *aCustomObject;
}

@property (nonatomic, retain) MyCustomClass *aCustomObject;

@end

在TableViewController的加载中,我尝试显示aCustomObject的内容。

TableViewController.m(文件的顶部以及我在模板文件中修改的内容):

#import "TableViewController.h"

@implementation TableViewController

@synthesize aCustomObject;

#pragma mark -
#pragma mark View lifecycle

- (void)viewDidLoad {
    [super viewDidLoad];

    // Uncomment the following line to display an Edit button in the navigation bar for this view controller.
    // self.navigationItem.rightBarButtonItem = self.editButtonItem;
    NSLog(@"Name : %@",self.aCustomObject.name);
}

之前,我在RootViewController中为aCustomObject.name创建并赋值:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
     TableViewController *detailViewController = [[TableViewController alloc] initWithNibName:@"TableViewController" bundle:nil];
    detailViewController.aCustomObject.name = @"The Name";
    [self.navigationController pushViewController:detailViewController animated:YES];
}

控制台说:

  

2011-06-22 07:21:11.087   MyTestApp [12822:207]名称:( null)

我认为这是一个愚蠢的事情,但经过几个小时的尝试后我才发现自己。

非常感谢,请原谅我的英语错误,

2 个答案:

答案 0 :(得分:2)

您忘记在tableViewController的viewDidLoad方法中初始化自定义对象。

试试这个。

- (void)viewDidLoad {
[super viewDidLoad];
if(aCustomObject == nil){
   self.aCustomObject = [[[MyCustomClass alloc] init] autoRelease];
 }
self.aCustomObject.name = @"";
// Uncomment the following line to display an Edit button in the navigation bar for this view controller.
// self.navigationItem.rightBarButtonItem = self.editButtonItem;
 //this will show empty here.
NSLog(@"Name : %@",self.aCustomObject.name);
}

答案 1 :(得分:2)

  

您可以使用@dynamic关键字来判断   你将完成的编译器   属性隐含的API合同   通过提供方法   直接或在运行时实现   使用其他机制,如动态   加载代码或动态方法   解析度。它抑制了警告   否则编译器会   生成,如果找不到合适的   实现。你应该使用它   只有你知道方法会   在运行时可用。

来自Apple Documentation

您在问题中声称您包含MyCustomClass.m的完整来源。你在哪里实现了属性的getter和setter?如果您希望编译器为您生成方法,则应使用

@synthesize name;