0

我对 Objective-c 编程有点陌生,无法理解如何在一种方法中创建 NSObject 并在另一种方法中使用它。

例如:

我有一个具有名字、姓氏等属性的用户对象。

@interface UserObject : NSObject

@property (nonatomic, retain) NSString *userID, *firstName, *lastName, *profilePic, *fullName, *email, *twitter, *followingCount, *followerCount;

@end

在我的 profileViewController.h 中,我将 currentUser 声明为@property (retain, nonatomic) UserObject *currentUser;

现在,问题来了。我有这个 IBAction

- (IBAction)followUser:(id)sender {
    NSLog(currentUser.firstName);
}

从服务器接收到 json 数据后,我运行了一个名为 ConnectionDidFinishLoading 的方法并在里面 ->

- (void)connectionDidFinishLoading:(NSURLConnection *)connection {
    [connection release];

    NSString *json = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding];
    [responseData release];
    NSDictionary *dataArray = [json JSONValue];

    UserObject *currentUserData = [[UserObject alloc] init];
    currentUserData.firstName = [dataArray objectForKey:@"first_name"];
    currentUserData.lastName = [dataArray objectForKey:@"last_name"];

    currentUser = currentUserData;        

    [dataArray release];
    [json release];
    [currentUserData release];
}

现在,问题来了。当我运行这个 IBAction 时,应用程序崩溃了。

- (IBAction)followUser:(id)sender {
NSLog(@"%@",currentUser.firstName);
}

我很确定这是因为 currentUser 不适用于此方法。有没有办法让 currentUser 对象成为全局对象,这样我就可以用任何方法来获取它?

4

3 回答 3

4

我认为您对实例变量和属性之间的区别感到困惑。您currentUser直接设置实例变量,它不保留对象 - 所以假设您不使用 ARC,它会过早地被销毁。您需要将currentUser设置为以下之一的行更改:

currentUser = [currentUserData retain];
// OR
self.currentUser = currentUserData;

self.currentUser语法是您访问属性的方式。如果没有点,您将直接访问 ivar。

于 2012-04-07T18:07:23.420 回答
1

试试这个 :

NSLog(@"%@",currentUser.firstName);

提示: %s用于 C 风格的字符串。

于 2012-04-07T17:32:44.330 回答
1

问题很可能是您在followUser:从服务器接收任何数据之前调用该方法,因此currentUser尚未创建,因此它是一个空/悬空指针,这很可能会使您的应用程序崩溃。在使用它之前进行测试以确保 currentUser 不为零:

if(currentUser) {
    //do what you want
    //if currentUser is nil, this if statement will evaluate to false
    NSLog(@"%@", currentUser.firstName);
}
于 2012-04-07T17:50:16.310 回答