你如何在所有方法中使NSObject“全球化”/可用?

时间:2012-04-07 17:29:52

标签: iphone objective-c cocoa methods nsobject

我对于Objective-c编程有点新手,并且无法理解如何在一个方法中创建NSObject并在另一个方法中使用它。

例如:

我有一个UserObject,其属性如firstName,lastName。

@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对象全局,所以我可以用任何方法获取它?

3 个答案:

答案 0 :(得分:4)

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

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

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

答案 1 :(得分:1)

试试这个:

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

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

答案 2 :(得分:1)

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

if(currentUser) {
    //do what you want
    //if currentUser is nil, this if statement will evaluate to false
    NSLog(@"%@", currentUser.firstName);
}