为什么我的IBOutlet在ARC下发布?

时间:2012-06-19 11:55:14

标签: ios cocoa-touch automatic-ref-counting iboutlet

问题

IBOutlet在我有机会使用之前就已发布。

我想要什么

我想从我的app委托访问导航控制器,以便重新加载表格视图。

我的设置

我有:

  • 在目标设置中设置为主界面的Main.xib
  • 作为我的应用代表上的ivar的导航控制器的IBOutlet
  • 此IBOutlet连接到Main.xib中正确的导航控制器
  • App Delegate在xib中实例化,但未设置为File&#39的所有者

我使用ARC,Xcode 4.3.2和iOS5.1

我尝试过的事情

  • 更改部署目标
  • 在dealloc上为导航控制器,应用代表设置了一个断点 - 他们从未调用过
  • 阅读我在ARC和IBOutlets上可以找到的所有内容 - 似乎没有任何与我正在做的事情相矛盾的
  • 创建一个只需要最少类别的新项目 - 我看到完全相同的问题

代码

KPAppDelegate.h

@interface KPAppDelegate : UIResponder <UIApplicationDelegate> {
    IBOutlet  KPBrowseExpensesNavigationController *nc;
}

@property (strong) IBOutlet KPBrowseExpensesNavigationController *nc;

KPAppDelegate.m

@implementation KPAppDelegate

@synthesize nc;

-(void)setNc:(KPBrowseExpensesNavigationController *)nc_ {
    nc = nc_; // This gets called on view load and nc gets set.
}

...snip...

// This is called about 5 seconds after app startup
-(void)objectLoader:(RKObjectLoader *)objectLoader didLoadObjects:(NSArray *)objects {
        // By the time we get here, nc is nil.
        UITableViewController *tvc = [[nc viewControllers] objectAtIndex:0];
        [[tvc tableView] reloadData];
}

@end

更新

必须在这里做一些非常愚蠢的事情。即使是一个非常简单的项目仍然显示这个问题。见下面的链接。

Download a simple test project that shows the problem.

4 个答案:

答案 0 :(得分:2)

是您将Interface Builder设置为KPBrowseExpensesNavigationController类型的出口吗? 如果不是,则不会在您的nib和ViewController之间创建连接。

您应该在Identity Inspector中将其自定义类设置为KPBrowseExpensesNavigationController

答案 1 :(得分:2)

在Window nib中,将FilesOwner类设置为UIApplication,然后将其从Outlets指向委托给AppDelegate对象。这是您的项目示例中的错误。

答案 2 :(得分:1)

我不确定你为什么要把它宣布为财产&amp;非财产。我应该这样做:

@interface KPAppDelegate : UIResponder <UIApplicationDelegate> 

@property (nonatomic, strong) IBOutlet KPBrowseExpensesNavigationController *nc;

在您的实施中:

@implementation KPAppDelegate

@synthesize nc = _nc; // So you don't accidentally use nc

...snip...

// This is called about 5 seconds after app startup
-(void)objectLoader:(RKObjectLoader *)objectLoader didLoadObjects:(NSArray *)objects {
        // By the time we get here, nc is nil.
        UITableViewController *tvc = [[**self.nc** viewControllers] objectAtIndex:0];
        [[tvc tableView] reloadData];
}

@end

希望这有帮助!

答案 3 :(得分:1)

我没看到你分配导航控制器的位置。只是声明属性不会为它分配任何值,所以它将是零。在app delegate中的-didFinishLaunchingWithOptions中,设置alloc / init语句。其他一切看起来都不错。

KPBrowseExpensesNavigationController *nc = [[KPBrowseExpensesNavigationController alloc] init];

如果您有自定义初始化,也可以使用它,但只需确保在尝试使用它之前进行设置。