- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我有一个工厂类构建了我定义的不同类型的 UITableViewCell,我们称它们为:TypeATableViewCell 和 TypeBTableViewCell。
现在我的工厂类中的方法定义如下:
+ (UITableViewCell*)getCellForIdentifier:(NSString*)identifier cellClass:(__weak Class)cellClass;
为什么有人会选择在这里使用 (__weak Class) 而不是 (Class)。
谢谢,尼古拉斯
最佳答案
一般来说,这无关紧要。 Class
es 是有效的 interned——一旦注册到运行时,AFAICT,它们就永远不能注销,所以运行时将总是“保留”它们(就是这样)。单步执行程序集显示 +[NSObject retain]
是一个空操作(只返回 self,不做任何其他事情)。但是,如果您创建一个新的根类并尝试保留它,就像这样...
Class foo = objc_allocateClassPair(nil, "Foo", 0);
[foo retain];
... 运行时会呕吐,因为新的根类没有实现 retain
这意味着如果你想让你的 API 容忍没有实现 retain< 的新根类
你必须将它们的用途标记为 __weak
这样 ARC 就不会对它们调用 retain
。所以我想,技术上你会总是希望 Class
类型的变量是弱的,但在实践中它不太可能重要,因为任何你将用作表格单元格类,无论如何都必须从 UITableViewCell
继承(从 NSObject
继承。)
PS: 刚刚走过,NSProxy
在这方面和NSObject
是一样的。似乎只是返回 self
并且什么都不做。因此,除非您不打算创建新的根类,否则跳过 __weak
限定符可能是安全的。
关于ios - 为什么在 Objective-C 的函数定义中使用 (__weak Class)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18926183/
我看到了两种不同的实现... __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,不指定弱或强意味着强。 所以如果我
我是一名优秀的程序员,十分优秀!