2012-04-07 50 views
0

我對Objective-C編程有點新手,無法理解如何在一個方法中創建一個NSObject並在另一個方法中使用它。你如何使一個NSObject「全局」/可用於所有方法?

例如:

我有像名字,姓氏性質的UserObject。

@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

'followUser'操作在'ProfileViewController.m'中,對不對? – 2012-04-07 17:54:31

+0

yes在.h中聲明爲 - (IBAction)followUser:(id)sender;並且該動作在.m文件中。 – 2012-04-07 17:56:36

+0

嗯,我的意思是這個' - (IBAction)followUser:(id)sender NSLog(@「%@」,currentUser.firstName); }''在'.m'文件中,對嗎? – 2012-04-07 17:57:55

回答

4

我想你感到困惑的實例變量和屬性之間的不同。你直接設置currentUser實例變量,它不保留對象 - 所以假設你沒有使用ARC,它會被過早銷燬。您需要更改其中currentUser設置爲其中之一行:

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

self.currentUser語法是你如何訪問屬性。沒有點,你直接訪問伊娃。

+0

完美!好的,我想現在我明白了它的區別。所以,我在connectionDidFinishLoading方法中使用了self.currentUser = currentUserData,然後在其他方法中,我可以通過currentUser.firstName等訪問它。非常棒!感謝大家的幫助。這樣一個偉大的社區:) – 2012-04-07 18:42:04

1

試試這個:

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

提示:%s用於C風格的字符串。

+0

糟糕。接得好。我打算在這裏寫下。這不是我遇到的問題。這個問題(我相信)是當前用戶不能用這種方法。 – 2012-04-07 17:38:15

+0

@BrianW爲什麼不在'NSLog'行之前放置一個斷點?然後你可能會看到發生了什麼...... – 2012-04-07 17:40:05

+0

@BrianW你也可以嘗試改變'currentUser = currentUserData'到'[self setCurrentUser:[currentUserData retain]];' – 2012-04-07 17:43:12

1

問題是最有可能是您所呼叫的followUser:方法是從你的服務器接收到任何數據之前,所以currentUser尚未創建,因此它是一個空/懸擺指針,這是最有可能崩潰您的應用程序。做一個測試使用它之前,爲了確保currentUser不是nil:

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

我只是在想它......你可能是對的...... – 2012-04-07 17:51:21

+0

不是;現在我正在重新考慮它,這是不對的。如果它是零,就不會有像'無法識別的選擇器'這樣的消息......呵呵? – 2012-04-07 17:53:20

+0

如果崩潰報告顯示'無法識別的選擇器',則問題可能是您更改了IBAction的名稱,而無需從Interface Builder重新連接它。試着打破你的界面生成器插座並重新連接它們。 – 2012-04-07 17:59:11

相關問題