- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在向我的 View 添加两个按属性存储的 subview 。将 subview 添加到我的 View 时, subview 似乎在我的 setup
方法被调用后被释放。最终结果是 View 永远不会显示。现在,如果我将我的属性更改为 strong
而不是 weak
我会保留对 View 的引用,它们现在会显示在屏幕上。那么这是怎么回事?为什么 addSubview:
和 insertSubview:
不保留 subview ?请看下面的代码:
顺便说一句,我正在使用带有 ARC 的 iOS5(因此有强项和弱项)
#import "NoteView.h"
@interface NoteView() <UITextViewDelegate>
@property (weak, nonatomic) HorizontalLineView *horizontalLineView; // custom subclass of UIView that all it does is draw horizontal lines
@property (weak, nonatomic) UITextView *textView;
@end
@implementation NoteView
@synthesize horizontalLineView = _horizontalLineView;
@synthesize textView = _textView;
#define LEFT_MARGIN 20
- (void)setup
{
// Create the subviews and set the frames
self.horizontalLineView = [[HorizontalLineView alloc] initWithFrame:self.frame];
CGRect textViewFrame = CGRectMake(LEFT_MARGIN, 0, self.frame.size.width, self.frame.size.height);
self.textView = [[UITextView alloc] initWithFrame:textViewFrame];
// some addition setup stuff that I didn't include in this question...
// Finally, add the subviews to the view
[self addSubview:self.textView];
[self insertSubview:self.horizontalLineView atIndex:0];
}
- (void)awakeFromNib
{
[super awakeFromNib];
[self setup];
}
- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
// Initialization code
[self setup];
}
return self;
}
最佳答案
这是您的一行代码:
self.horizontalLineView = [[HorizontalLineView alloc] initWithFrame:self.frame];
回想一下,horizontalLineView
属性很弱。让我们通过 ARC 生成的额外代码来了解该行中真正发生的事情。首先,您发送 alloc
和 initWithFrame:
方法,返回一个强引用:
id temp = [[HorizontalLineView alloc] initWithFrame:self.frame];
此时,HorizontalLineView
对象的保留计数为 1。接下来,因为您使用点语法设置了 horizontalLineView
属性,所以编译器生成代码以将 setHorizontalLineView:
方法发送给 self
,将 temp
作为参数传递。由于 HorizontalLineView
属性被声明为 weak
,setter 方法执行以下操作:
objc_storeWeak(&self->_horizontalLineView, temp);
设置 self->_horizontalLineView
等于 temp
,并将 &self->_horizontalLineView
放在对象的弱引用列表中。但它不会增加 HorizontalLineView
对象的保留计数。
最后,因为不再需要 temp
变量,所以编译器生成了这个:
[temp release];
这会将 HorizontalLineView
对象的保留计数降低到零,因此它会释放该对象。在释放过程中,它遍历弱引用列表,并将每个弱引用设置为 nil
。所以 self->_horizontalLineView
变成了 nil
。
解决这个问题的方法是使 temp
变量显式化,这样您就可以延长它的生命周期,直到将 HorizontalLineView
对象添加到它的父 View 之后,这保留它:
HorizontalLineView *hlv = [[HorizontalLineView alloc] initWithFrame:self.frame];
self.horizontalLineView = hlv;
// ...
[self insertSubview:hlv atIndex:0];
关于iphone - 为什么addSubview是: not retaining the view?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9747015/
在这样的代码中,(retain, nonatomic) 和 (nonatomic, retain) 之间有什么区别: @property (retain, nonatomic) YellowViewC
我有一段 Objective-C 代码,如下所示: - (NSString *)copyData:(NSData *)data { NSString *path = [[[self outpu
当对一个对象多次调用 -retain 时会发生什么?用完之后就释放一次可以吗? 最佳答案 通常,您需要释放对象的次数与保留对象的次数相同 - 这就是它被称为引用计数的原因。对象指针的持有者调用 -re
我仍然对内存管理的微妙方面感到不安,并且我对我在一些示例代码中看到的激进保留/释放有疑问。具体来说: - (void)loadContentForVisibleCells { NSArray
嗨,我已经实现了: - (NSImage *)dragImageForRowsWithIndexes:(NSIndexSet *)dragRows tableColumns:(NSArray *)ta
在下面的代码片段中, function retreive_data_from_UI() { let arr_rows = []; cy.get(constants.cssCustome
是否可以在您的应用程序运行时连续解锁屏幕。 最佳答案 您可以使用 WakeLock .但这不是一个好的解决方案,因为您必须手动获取和释放它。并且 AFAIK 它需要许可。更好的解决方案是对需要屏幕打开
我想知道以下两者之间的区别: NSMutableArray *myArray = [[someObject returnMutableArray] retain]; 和 NSMutableArray
我为 iOS 4 编写了数千行代码。代码库包含许多对 retain 和 release 的调用,当项目更新到 iOS 5 时会导致错误和 ARC。 有没有办法自动将手动保留释放 (MRR) 代码转换为
我正在向我的 View 添加两个按属性存储的 subview 。将 subview 添加到我的 View 时, subview 似乎在我的 setup 方法被调用后被释放。最终结果是 View 永远不
给定具有保留属性的类的以下定义: @interface FeedEntry : NSObject { NSURL* url; NSData* source; } @property
我正在使用 HTML textarea 让用户输入一些数据并将其保存到 App Engine 的模型中 问题是,当我检索内容时,它只是文本,所有格式都消失了 原因是在 textarea 中没有我们可以
我正在处理 this example它解释了如何使用 proc mcmc 拟合标准 Cox 模型在 SAS 9.3 . 对于数据中的第一行 ( ind=1 ), S=exp(bZ)与其他量一起计算。需
我已经从众多 Apple 代码示例之一中实现了一些代码,但遇到了一些麻烦,因为其中一个属性的保留属性似乎不起作用。这是属性声明: @property (nonatomic, retain) Editi
我是一名初学 iPhone 开发人员,我想知道 @property(非原子,保留)语句的用法和示例,任何人都可以给我任何答案吗? 最佳答案 @property 告诉 Objective-C 当该成员变
我正在尝试使用一些 iPhone Core Data 代码来调试一个非常邪恶的问题。 设置是这样的:我有一个线程来轮询Web服务并通过NSNotification将其结果发送到主线程(在userDic
我有一个非常简单的程序,我只需创建一个对象并查看保留计数。 #import #import "GeometryCalculator.h" int main (int argc, const char
NSMenuItem -setTarget:它是否保留目标,还是应该显式保留它? 我见过关于此的相互矛盾的文档。我知道 NSInitation 中的 keepArguments,但我不确定这是否适用于
我的问题是 this 的 Scala (Java) 变体Python 上的查询。 特别是,我有一个字符串 val myStr = "Shall we meet at, let's say, 8:45
这个问题在这里已经有了答案: @property retain, assign, copy, nonatomic in Objective-C (5 个答案) 关闭 9 年前。 当我在 iOS 中为
我是一名优秀的程序员,十分优秀!