【问题标题】:Why is my IBOutlet being released under ARC?为什么我的 IBOutlet 在 ARC 下发布?
【发布时间】:2012-06-19 11:55:14
【问题描述】:

问题

一个 IBOutlet 在我有机会使用它之前就发布了。

我想要什么

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

我的设置

我有:

  • 在目标设置中设置为主界面的 Main.xib
  • 导航控制器的 IBOutlet 作为我的应用委托上的 ivar
  • 这个 IBOutlet 连接到 Main.xib 中正确的导航控制器
  • App Delegate 在 xib 中实例化,但未设置为文件所有者

我正在使用 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.

【问题讨论】:

  • 非常非常好的问题示例

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


【解决方案1】:

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

【讨论】:

  • 你,先生,太棒了。这确实发生在我身上,但由于代表似乎要被处决,我认为这不是问题。我希望我在 5 小时前尝试过这个……!再次感谢。
  • 没问题,在项目中比这里的某些代码行更容易解决。所以你通过一个项目的例子解释得很好:)
【解决方案2】:

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

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

【讨论】:

  • 还是不行。出口/伊瓦尔仍然为零。有关显示问题的超简单项目,请参阅上面的更新。
【解决方案3】:

我不确定您为什么将其声明为财产和非财产。我应该这样做:

@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

希望这会有所帮助!

【讨论】:

  • 谢谢,但它仍然为零。 :( 我显然误解了@property,所​​以感谢您澄清这一点。
【解决方案4】:

我没有看到您分配导航控制器的位置。只是声明该属性不会为其分配任何值,因此它将为零。在应用程序委托中的 -didFinishLaunchingWithOptions 中,设置您的 alloc/init 语句。其他一切看起来都很好。

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

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

【讨论】:

  • 控制器已在 nib 文件中初始化。不过谢谢你的建议!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多