我对于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对象全局,所以我可以用任何方法获取它?
答案 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);
}