iOS接受者和接受者混淆

iOS接受者和接受者混淆,ios,ios4,Ios,Ios4,我想我对iOS@property getter和setter有点困惑。我正在尝试在另一个类的AppDelegate.h文件中设置NSString iVar,以便项目中的所有类都可以使用它 例如,我正在一个iPhone项目中工作,该项目在AppDelegate.h中存储了一个iVar NSString*currentUser。我需要能够通过ViewController.m中的一个方法设置它,然后通过第二个ViewController中的另一个方法获得它 也许盖特和二传是错误的进攻方向?我知道我不想

我想我对iOS@property getter和setter有点困惑。我正在尝试在另一个类的AppDelegate.h文件中设置NSString iVar,以便项目中的所有类都可以使用它

例如,我正在一个iPhone项目中工作,该项目在AppDelegate.h中存储了一个iVar NSString*currentUser。我需要能够通过ViewController.m中的一个方法设置它,然后通过第二个ViewController中的另一个方法获得它

也许盖特和二传是错误的进攻方向?我知道我不想alloc init AppDelegate,因为iVar只存在于该对象中,我希望所有类中的所有对象都可以访问它

请有人纠正我的错误

祝你一切顺利,
Darren

以下是应用程序代理的设置

@interface AppDelegate
{
   NSString *__currentUser;
}
@property (monatomic, copy) NSString* currentUser;
@end

@implementation AppDelegate
@synthesize currentUser = __currentUser;

- (void) dealloc
{
   [__currentUser release];
   [super dealloc];
}
@end
从一个视图控制器,您可以为当前用户设置一个值,然后从后续的视图控制器,出于某种恶意目的获取该值

@implementation LoginController
- (void) viewDidLoad
{
    ...
    AppDelegate *bob = [[UIApplication sharedApplication] delegate];
    [bob setCurrentUser: @"Jim Kirk"];
    ...
}
@end
在稍后出现的其他一些视图控制器中,可以访问当前用户的值

@implementation ProfileViewController
- (void) viewDidLoad
{
   ...
   AppDelegate *bob = (AppDelegate *)[[UIApplication sharedApplication] delegate];
   NSString * user = [bob currentUser];

   // insert nefarious purpose for current user value here
   ...
}
@end

似乎使用单例可能是一个解决方案;你试过了吗?(虽然我知道一些人不喜欢使用单例作为解决方案)应用程序代理实际上是作为单例。通常只有一个实例在运行,并且可以通过UIApplication singleton从任何地方访问它。在iOS系统中,如果不打一个单身汉,就不可能挥动一只死猫……我看了一下单身汉,认为可能有一个更简单的方法。我喜欢Bill使用app delegate的解决方案。现在我要让它正常工作。嘿,谢谢比尔,这几乎让我达到了目的。那里真的有很多有用的知识。我现在已经有了设置变量的代码,没有问题,但我想知道您是否可以详细说明一下如何访问变量,因为您的代码似乎不正确?我更新了我的答案,对AppDelegate*进行了转换。实际上,您可能不需要强制转换,因为该值被分配给AppDelegate类型的局部变量。把它放在里面不会有任何伤害。长UIApplication咒语的常见解决方案是在前缀头文件中为其创建宏#定义APP_DELEGATE=(AppDelegate*)[[UIApplication sharedApplication]DELEGATE],然后在需要时使用APP_DELEGATE。例如[APP_DELEGATE currentUser];多亏了比尔的密码,我现在才有了最后一部分。替换的NSString*用户=[[UIApplication sharedApplication]委托]当前用户];使用以下命令:AppDelegate*user=[[UIApplication sharedApplication]delegate];NSString*currentUser=user.currentUser;//只是为了证明它是有效的NSLog(@“这是currentUser:%@”,currentUser);谢谢各位,这回答了我的问题。我并没有以正确的方式看待得手和二传手。