从UITableView委托方法访问实例变量

时间:2009-08-15 03:31:45

标签: iphone objective-c cocoa-touch uitableview delegates

问题:

我正在尝试从UITableView tableView:didSelectRowAtIndexPath:委托方法访问变量。可以从数据源方法访问该变量,但是当我尝试从诸如此类的委托方法访问它时,应用程序崩溃。

我在.h文件中声明变量,并在applicationDidFinishLaunching方法的.m文件中初始化它。我还没有宣布任何访问者/变异者。

奇怪的是,如果我声明这样的变量就不会出现问题:

helloWorld = @"Hello World!";

...但是如果我像这样声明变量,那就确实如此:

helloWorld = [NSString stringWithFormat: @"Hello World!"];

有关可能发生的事情的任何想法?我错过了什么?

完整代码:

UntitledAppDelegate.h:

#import <UIKit/UIKit.h>

@interface UntitledAppDelegate : NSObject <UIApplicationDelegate, UITableViewDelegate, UITableViewDataSource>  {
    UIWindow *window;
    NSString *helloWorld;
}

@property (nonatomic, retain) IBOutlet UIWindow *window;

@end

UntitledAppDelegate.m:

#import "UntitledAppDelegate.h"

@implementation UntitledAppDelegate

@synthesize window;


- (void)applicationDidFinishLaunching:(UIApplication *)application {

    helloWorld = [NSString stringWithFormat: @"Hello World!"];

    NSLog(@"helloWorld: %@", helloWorld); // As expected, logs "Hello World!" to console.

    [window makeKeyAndVisible];
}

- (void)dealloc {
    [window release];
    [super dealloc];
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
     return 1;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *MyIdentifier = @"MyIdentifier";    
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:MyIdentifier]; 
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:MyIdentifier] autorelease];
    }   
    cell.textLabel.text = @"Row";
    return cell;
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    NSLog(@"helloWorld: %@", helloWorld); // App crashes
}

@end

1 个答案:

答案 0 :(得分:3)

您需要保留helloWorld实例变量。试试这个:

helloWorld = [[NSString stringWithFormat: @"Hello World!"] retain];

它在第一个实例中起作用,因为静态字符串是“无限保留的”,因此永远不会被释放。在第二个中,一旦事件循环运行,您的实例变量就会被释放。保留它会阻止这种情况。