我设置一个全局变量来存储从socket逐个服务器获取的字符串值。 套接字是在appdelegate中实现的,如下所示:
在appdelegate.h中:
@interface AppDelegate : NSObject <NSStreamDelegate,UIApplicationDelegate> {
UIWindow *window;
UITabBarController *tabBarController;
NSInputStream *inputStream;
NSOutputStream *outputStream;
NSString *sn,*sn1;
}
@property (nonatomic, retain) IBOutlet UIWindow *window;
@property (nonatomic, retain) IBOutlet UITabBarController *tabBarController;
@property (nonatomic, retain) NSInputStream *inputStream;
@property (nonatomic, retain) NSOutputStream *outputStream;
@property (nonatomic, retain) NSString *sn,*sn1;
@synthesize sn,sn1
然后当传入套接字流委托时,我设置
sn=input
NSLog(@"1st sn: %@",sn);//this sn correct!
然后在SecondViewControll.m中 我设置 SN1 = @ “你好”;
在FirstViewControll中,我实现如下: AppDelegate * appDel;
- (void)viewDidLoad
{
[super viewDidLoad];
appDel = (AppDelegate *)[[UIApplication sharedApplication] delegate];
NSLog(@"sn1: %@",sn1);;//this sn correct!
LTField.text=appDel.sn; //this one gives error as below,
}
错误是:
-[__NSCFSet _isNaturallyRTL]: unrecognized selector sent to instance 0x5f87580
2013-06-23 22:49:26.038 test[2987:12c03] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFSet _isNaturallyRTL]: unrecognized selector sent to instance 0x5f87580'
我不知道为什么最后一行会出错但前一行得到正确值? 我猜是因为sn是委托中的设置值,然后它没有传递出deletegate。 如何从该流委托传递正确的数据到此文本字段?
答案 0 :(得分:1)
尝试在NSLog(@"sn: %@", sn);
日志后添加sn1
。设置sn = input;
后,可能会在该方法完成后input
超出范围。这使sn
成为无效指针,并传递LTField.text
空引用。通常,当您希望将NSString
对象作为参数传递时,您将使用:
sn = [input copy];
您希望copy
输入变量,因为NSString
是不可变的,类似于retain
可变对象的方式。
此外,您应该将@property
声明更改为(nonatomic, copy)
的{{1}},然后您可以使用
NSString
如果您愿意(因为使用self.sn = input;
和点符号调用setter而不是直接使用变量)。有关其他信息,请参阅此问题:NSString property: copy or retain?