- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
刚开始使用 ARC。在 ARC 之前,我只是简单地声明我的导出,例如:IBOutlet UIButton *button;
所以我不会保留它或任何东西。对于 ARC,不指定弱或强意味着强。
所以如果我在 ARC 下做同样的事情(即 IBOutlet UIButton *button;
),这是否意味着按钮是一个强引用?还是我必须明确地将其定义为弱?
简而言之,IBOutlet 是否暗示__weak?
最佳答案
单词IBOutlet
实际上没有定义:
#define IBOutlet
Xcode 只是在您的代码中使用这个词的存在,以允许您在 Interface Builder 中建立连接。将变量或属性声明为 IBOutlet
:
IBOutlet UIButton * button;
@property (...) IBOutlet UIButton * button;
因此,就 ARC 而言,没有任何直接影响;它不会(尽管可以想象,它可以)转化为 __weak
或类似的东西。当编译器获取该词时,该词本身已完全从您的源代码中消失。
另一方面,这个变量或属性是一个导出这一事实确实对您需要如何考虑内存管理产生了有意义的影响。 p>
对象变量声明的隐式存储限定符,如 IBOutlet UIButton * button;
在 ARC 下是 __strong
,如您所说 - 分配给该变量的任何对象都将是被视为“拥有”。在 MRR 下,声明只是一个指针;分配给已分配对象的引用计数/所有权没有影响——它的行为方式与 assign
属性相同。*因此,相同的 ivar 声明的含义在两个管理系统之间发生变化.
xib 中的对象具有由 View 层次结构形成的所有者/所有者关系;也就是说,父 View 拥有它们的 subview 。 xib 中的顶级 View 由称为文件所有者的对象拥有。这种设置意味着,一般来说,您在 xib 中不是顶级对象的导出应该是weak
(在 ARC 下)或assign
(如果是 MRR 下的属性(property))。他们不拥有关系;它们本质上是 View 列表中方便的索引。这是 Apple's recommendation :
...you don’t need strong references to objects lower down in the graph because they’re owned by their parents, and you should minimize the risk of creating strong reference cycles.
[...]Outlets should generally be
weak
, except for those from File’s Owner to top-level objects in a nib file (or, in iOS, a storyboard scene) which should bestrong
. Outlets that you create should will [sic] therefore typically beweak
by default...
正如我所解释的,您的简单指针 IBOutlet
的行为——出于内存管理的目的——就像 weak
属性,** 这意味着它们正在做正确的事情事物。在 ARC 下编译时,相同的声明可能是错误的。
总结:IBOutlet
没有翻译 为weak
,但它确实改变了指针的含义。由于 IBOutlet UIButton * button;
的默认内存管理语义从 MRR 下的“分配”更改为 ARC 下的“拥有”,并且由于 IBOutlet
通常应该是非拥有的,IBOutlet
的存在确实暗示指针应该在 ARC 下声明为 __weak
。†
*类似于 weak
属性——唯一的区别是当对象被释放时 weak
指针被设置为 nil
.
**自动nil
部分除外。
†或者,实际上,它应该是一个弱
属性。
关于objective-c - IBOutlet 是否暗示 __weak?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10308792/
我看到了两种不同的实现... __weak UIDataType *weakSelf = self; 和 UIDataType __weak *weakSelf = self; 但它们似乎都有效。引擎
我有一个应用程序(仅限 ios5),它在方法内声明了一个在 block 内使用的弱变量,以引用 View Controller 的实例。 QRCodeViewController * __weak
如果对象被释放,Objective-C 弱属性应该指向 nil,但在这种情况下,弱属性似乎保留了对象。考虑这样一个案例: @interface SillyObject : NSObject @prop
在 boost C++ 中,弱指针被实现为共享(引用计数)指针的观察者。 它们是如何在 objective-c 中实现的,为什么这需要运行时支持? (即除了有编译器支持,还需要iOS 5以上才能使用弱
我有以下代码: __weak id weakSelf = self; [geocoder reverseGeocodeLocation:currLocation completionHandl
在ARC中,下面这行代码有意义吗?请确认。 __block __weak MyViewController_iPad *blockSelf = self; 这不会抛出任何错误。不知道为什么。 考虑以下
id obj = [[NSObject alloc] init]; @autoreleasepool{ id __weak weakObj = obj; _objc_autorelea
我从事同一个项目已有一段时间了,随着时间的推移,我对 Objective-C 和 Cocoa 的理解也有了一些进展。回顾我的代码的某些部分,我看到了这一点: __weak ASIFormDataReq
id __weak obj1 = obj0; 等于 id __weak obj1 = obj0; id __autoreleasing tmp = obj0; 适用于 iOS 和 OSX 的 Pro
这是我的代码: extern void _objc_autoreleasePoolPrint(); int main(int argc, const char * argv[]) { NSAr
这两行代码有区别吗? __weak IBOutlet UITextField *usernameField; @property (weak) IBOutlet UITextField *userna
NSString *myString = [NSString stringWithFormat:@"string1"]; __weak NSString *myString1 = myString;
我正在编写一个工具,如果知道类的哪些实例变量被声明为 __weak,将会受益。 此信息必须在运行时存在于某处,但是否有任何方式访问它、记录或以其他方式? (这是一个工具,所以我不太关心它是否会随着更新
如果我向弱对象发送消息会怎样?发送消息是否拥有该对象并将其保存在内存中直到返回? 我在想这个模式: __weak MyObject *weakSelf = self; dispatch_async(d
我想在 block 中使用弱自我,但是在 block 中这个weakSelf变成了nil 刚刚创建,在 block 之前(尝试使用不同的变体) - 看起来一切正常 但后来在 block - 每个变种为
我遇到过这段代码并使用它成功地为按钮上的图像着色,直到它在 iOS 9 发布版本中开始失败: UIImage * __weak image = [[self imageForState:UIContr
从大量关于打破 block 内保留循环的问题中,我的问题如下: 该 block 实际上如何处理其中的 __weak 引用? 我知道这一点(摘自 here ): Blocks will retain a
我有这行代码: __weak NSBlockOperation *weakOperation = operation; 这是触发此编译器错误: __weak attribute cannot be s
Mike Ash has written this introduction to ARC 他介绍了类似的东西: __weak Foo *_weakFoo = [object foo]; 为什么我要对
刚开始使用 ARC。在 ARC 之前,我只是简单地声明我的导出,例如:IBOutlet UIButton *button; 所以我不会保留它或任何东西。对于 ARC,不指定弱或强意味着强。 所以如果我
我是一名优秀的程序员,十分优秀!