我正在尝试创建一个UICollectionViewCell链接了一个xib 的子类,我已经这样做了:我创建了一个新的xib文件并UICollectionViewCell在其中添加了一个,然后我创建了这个子类文件:
@interface MyCell : UICollectionViewCell
@property (weak, nonatomic) IBOutlet UILabel *label;
@end
Run Code Online (Sandbox Code Playgroud)
另外我在文件所有者自定义类中链接了MyCell接口构建器中的类,并且我添加了一个UILabel,然后在我的UICollectionViewviewDidLoad中我这样做:
[self.collectionView registerClass:[MyCell class] forCellWithReuseIdentifier:@"MyCell"];
UINib *cellNib = [UINib nibWithNibName:@"MyCell" bundle:nil];
[self.collectionView registerNib:cellNib forCellWithReuseIdentifier:@"MyCell"];
Run Code Online (Sandbox Code Playgroud)
除此之外:
- (UICollectionViewCell *)collectionView:(UICollectionView *)cv cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
MyCell *cell = (MyCell*)[cv dequeueReusableCellWithReuseIdentifier:@"MyCell" forIndexPath:indexPath];
cell.label.text = @"Cell Text";
return cell;
}
Run Code Online (Sandbox Code Playgroud)
但是这不起作用,我收到此错误:
*** Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[<NSObject 0x907eca0> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the …Run Code Online (Sandbox Code Playgroud) 我正在使用故事板instantiateViewControllerWithIdentifier:,我注意到IBOutlets我所连接的所有内容仍然是零.但是,IBActions我已经连线工作了.视图和控制器是链接的(即controller.view不是nil),如果我显示视图,它会显示我期待的内容.
我错过了什么?
这是我的设置:
instantiateViewControllerWithIdentifier:IBOutlets和IBActions.还有一个类似的问题这对SO 在这里,但我只是想澄清的东西,并没有完全解释存在.
据我所知,所有代表和出口 - 事实上任何对"父"对象的引用,作为一个好公民,并考虑一分钟的对象图 - 应该归结为弱引用.由于零指针的性质在引用对象的保留计数达到零时自动降至零,这是否意味着现在将IBOutlets设置为nil viewDidUnload是不必要的?
所以,如果我这样宣布我的出口:
@property (nonatomic, weak) IBOutlet UILabel *myLabel;
Run Code Online (Sandbox Code Playgroud)
以下代码是否有效?
- (void)viewDidUnload
{
self.myLabel = nil;
[super viewDidUnload];
}
Run Code Online (Sandbox Code Playgroud) 我已将项目切换到ARC,我不明白是否必须使用strong或weak用于IBOutlets.Xcode执行此操作:在界面构建器中,如果创建一个UILabel例如我将它与助理编辑器连接到我的ViewController,它创建:
@property (nonatomic, strong) UILabel *aLabel;
Run Code Online (Sandbox Code Playgroud)
它使用了strong,而不是我在RayWenderlich网站上阅读的教程说:
但对于这两个特殊属性我还有其他计划.而不是
strong,我们将其声明为weak.
@property (nonatomic, weak) IBOutlet UITableView *tableView;
@property (nonatomic, weak) IBOutlet UISearchBar *searchBar;
Run Code Online (Sandbox Code Playgroud)
Weak是所有插座属性的推荐关系.这些视图对象已经是视图控制器视图层次结构的一部分,不需要在其他地方保留.声明出口的最大好处weak是可以节省编写viewDidUnload方法的时间.目前我们
viewDidUnload看起来像这样:
- (void)viewDidUnload
{
[super viewDidUnload];
self.tableView = nil;
self.searchBar = nil;
soundEffect = nil;
}
Run Code Online (Sandbox Code Playgroud)
您现在可以将其简化为以下内容:
- (void)viewDidUnload
{
[super viewDidUnload];
soundEffect = nil;
}
Run Code Online (Sandbox Code Playgroud)
所以使用weak,而不是strong,并删除设置为nil videDidUnload,而不是Xcode使用strong,并使用self... = nil …
weak-references ios ios5 automatic-ref-counting strong-references
我正在使用Xcode 6.2进行iOS项目.在旧版本的Xcode中,当为IBOutlet创建连接时,它始终是弱存储.现在,当我创建连接时,它们默认为强大.我这样离开,并没有注意到任何差异.
哪个版本的Xcode默认更改为强,为什么?
当你读到这里在大多数情况下,IBOutlet应该是弱.
现在,您可以在开发库中阅读并非所有类都支持弱引用.(例如NSTextView).这意味着您必须使用assign:
@property (assign) IBOutlet NSTextView *textView;
Run Code Online (Sandbox Code Playgroud)
如果使用弱引用,您将收到以下错误:"不允许合成弱不可用属性,因为它需要合成__weak对象的ivar"
文档错过的内容是现在你必须在使用后再将属性设置为nil,例如通过一种dealloc方法:
- (void)dealloc
{
self.textView = nil;
}
Run Code Online (Sandbox Code Playgroud)
据我所知,标NS_AUTOMATED_REFCOUNT_WEAK_UNAVAILABLE有的类不支持弱引用,但原因是什么?
我有一个随机UIWebView使用崩溃iOS8.1和UIWebView,使用iPhone5的.在我的测试中,崩溃不会出现在iOS7上.
我创建了这个github存储库来重现崩溃:https: //github.com/crarau/WebViewCrash
基本上我正在添加一个UIWebView并加载www.amazon.com
随机的应用程序崩溃的上WebThread与EXC_ARM_BREAKPOINT
在控制台上启用Zombie跟踪后,会显示以下消息:
[UIViewAnimationState release]: message sent to deallocated instance 0x14deff70
Run Code Online (Sandbox Code Playgroud)
这里UIView加载时会发生什么:
[super viewDidLoad];
NSURLRequest * urlRequest = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.amazon.com"]];
self.webView.layer.cornerRadius = 0;
self.webView.userInteractionEnabled = YES;
self.webView.multipleTouchEnabled = YES;
self.webView.backgroundColor = [UIColor clearColor];
self.webView.scrollView.scrollEnabled = NO;
self.webView.scrollView.bounces = NO;
[self.webView loadRequest:urlRequest];
Run Code Online (Sandbox Code Playgroud)
异常堆栈跟踪:
Exception Type: EXC_BREAKPOINT (SIGTRAP)
Exception Codes: 0x0000000000000001, 0x000000000000defe
Triggered by Thread: 2
Thread …Run Code Online (Sandbox Code Playgroud) 每:
@IBOutlet weak var nameLabel: UILabel!
Run Code Online (Sandbox Code Playgroud)
每当我声明我的IBOutlets时,我只使用var而不是weak var.但我最近遇到了一些使用弱var的代码模板.他们为什么这样做?还有什么好处?
为什么在UILabel结束时会有一个爆炸操作员.我知道这是必需的,我和它一起去,但现在就问它.
提前致谢.
我在NIB文件中布局了一个视图,然后将我的UIView子类添加为文件所有者.
子类看起来像这样:
@property (nonatomic, weak) IBOutlet UILabel *categoryLabel;
@property (nonatomic, weak) IBOutletCollection(UIImageView) NSArray *images;
Run Code Online (Sandbox Code Playgroud)
由于这个原因,属性很弱:https://stackoverflow.com/a/7729141/1016515
然后我将标签和UIB中的UIImageViews从视图连接到文件所有者.
然后,在子类的awakeFromNib部分,我这样做了:
[[NSBundle mainBundle] loadNibNamed:@"CategoryButton" owner:self options:nil];
NSLog(@"label: %@",self.categoryLabel);
NSLog(@"images: %@",self.images);
Run Code Online (Sandbox Code Playgroud)
我希望看到categoryLabel和图像的地址.相反,我发现类别标签很好,图像是nil.
这是非常令人费解的,因为声明images和categoryLabel相同.为什么一个工作而另一个工作失败?
我以为我从这个问题中清楚地理解了这一点 - > 在ARC下IBOutlets是强还是弱?但我最近进行了一次讨论,让我完全糊涂了.有人可以确认以下是否正确?(如果这是一个副本,我并不打算违反任何规则..只需要澄清,因为我可以理解图表比文字更好..)

ARC下(MacOSx)
如果这是正确的,那么有人可以确认..
在上图中,我们在屏幕上有一个windowControllerA .在windowControllerA的视图中,有2个NSView.view1属于windowController,但是mainView属于insregciated viewController,ViewControllerB的视图.
ViewControllerB在其mainView中还包含2个视图.View2由viewControllerB拥有,而view3属于另一个实例viewController,ViewControllerC.
ViewController C拥有一个它拥有的视图.