我正在使用Swift 2并使用WeakContainer作为存储一组弱对象的方式,就像 NSHashTable.weakObjectsHashTable()
struct WeakContainer<T: AnyObject> {
weak var value: T?
}
public protocol MyDelegate : AnyObject {
}
Run Code Online (Sandbox Code Playgroud)
然后在我的ViewController中,我声明
public var delegates = [WeakContainer<MyDelegate>]
Run Code Online (Sandbox Code Playgroud)
但这是错误的
使用MyDelegate作为符合协议AnyObject的具体类型不受支持
我看到的错误是,WeakContainer具有value声明为成员weak,因此T有望成为对象.但我也声明MyDelegate为AnyObject也.怎么解决这个问题?
这用于Objective-C 的弱化模式
我的猜测是它意味着:为自己分配一个名为'weakSelf'的自我弱引用和自我类型(例如MyViewController)
如果它是正确的并且看起来很明显:我希望绝对确保做到这一点.谢谢.
似乎有3种方法告诉GCC弱连接符号:
__attribute__((weak_import))__attribute__((weak))#pragma weak symbol_name这些都不适合我:
#pragma weak asdf
extern void asdf(void) __attribute__((weak_import, weak));
...
{
if(asdf != NULL) asdf();
}
Run Code Online (Sandbox Code Playgroud)
我总是得到这样的链接错误:
Undefined symbols:
"_asdf", referenced from:
_asdf$non_lazy_ptr in ccFA05kN.o
ld: symbol(s) not found
collect2: ld returned 1 exit status
我在OS X 10.5.5上使用GCC 4.0.1.我究竟做错了什么?
当你读到这里在大多数情况下,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有的类不支持弱引用,但原因是什么?
我想像我们在Objective-c中所习惯的一样快速地指向自我
__weak Something *weakself = self;
Run Code Online (Sandbox Code Playgroud)
我找到人们解释如何在一个街区内使用"弱自我",
{ in [unowned self] ...}
Run Code Online (Sandbox Code Playgroud)
但是我不想在我的块中定义'weakself',我想在块之外定义弱自己
假设我有一些表示网络连接的对象.断开这些连接后,关联的对象将消失.我不想挂在不再连接的连接对象上.
我还想使用字典将一些数据与这些连接相关联.所以我可能有代码:
class Connection { ... }
class Metadata { ... }
var metadata: [Connection: Metadata] = [:]
Run Code Online (Sandbox Code Playgroud)
但是上面的代码意味着字典将保留对Connection我不想要的对象的引用.当Connection对象消失时,我更愿意删除关联的条目,理想情况是自动删除.
所以我尝试过:
var metadata: [weak Connection: Metadata] = [:]
Run Code Online (Sandbox Code Playgroud)
但这不起作用.什么是一个很好的替代解决方案?
由于遗留原因,我需要使用侵入式指针,因为我需要能够将原始指针转换为智能指针.
但是我注意到没有弱的侵入式指针可以提升.我确实在boost线程列表上找到了关于它的讨论,但没有具体的.
有谁知道弱侵入指针的线程安全实现?
谢谢Rich
目前我在使用Xcode 4.0.2的Mac OS X 10.6.7上遇到了弱链接问题.
robin@chameleon:/tmp/o$ gcc --version
i686-apple-darwin10-gcc-4.2.1 (GCC) 4.2.1 (Apple Inc. build 5666) (dot 3)
Run Code Online (Sandbox Code Playgroud)
正如文档http://developer.apple.com/library/mac/#technotes/tn2064/_index.html所说,我们可以使用gcc 属性((weak_import))作为弱链接符号.但是,以下示例代码始终抛出编译错误.如下:
weak.c:
#include <stdlib.h>
#include <stdio.h>
extern int SayHello() __attribute__((weak));
int main()
{
int result;
if (SayHello!=NULL)
{
printf("SayHello is present!\n");
result=SayHello();
}
else
printf("SayHello is not present!\n");
}
Run Code Online (Sandbox Code Playgroud)
错误消息如下:
robin@chameleon:/tmp/o$ gcc weak.c
Undefined symbols for architecture x86_64:
"_f", referenced from:
_main in cceOf2wN.o
(maybe you meant: __dyld_func_lookup)
ld: symbol(s) not found for architecture x86_64
collect2: ld returned …Run Code Online (Sandbox Code Playgroud) 在NSMutableArray中添加对象的正确方法是什么,该对象由属性强烈定义.
[tapBlockView setTapBlock:^(UIImage* image) {
[self.myImageArray addObject:image]; // self retain cycle
}
Run Code Online (Sandbox Code Playgroud)
如果我将创建弱引用之类的东西
__weak NSMutableArray *array = self.myImageArray;
[tapBlockView setTapBlock:^(UIImage* image) {
[array addObject:image]; // If I will do this then how will I update original Array ?
}
Run Code Online (Sandbox Code Playgroud)
我也试过了
__weak id weakSelf = self;
[tapBlockView setTapBlock:^(UIImage* image) {
[weakSelf storeImageInaNewMethod:image]; // Calling SToreImageInaNewMethod
}
Run Code Online (Sandbox Code Playgroud)
和
-(void)storeImageInaNewMethod:(UIImage*)image {
[self.myImageArray addObject:image]; // This again retaining cycle
}
Run Code Online (Sandbox Code Playgroud)
更新属性定义的原始对象的正确方法是什么?
我对Xcode 7中看到的东西感到有些困惑,下面的3种颜色都有你想要的单独地址,但弱颜色都有相同的地址.我知道弱色是选项,所以weak_R和color_R有不同的地址,但我不能完全解释为什么所有3个弱显示相同的地址.
这看起来是否正确,如果是,有人可以解释我所看到的吗?如果不是我猜它是一个错误.
var color_R = SKColor.redColor()
var color_G = SKColor.greenColor()
var color_B = SKColor.blueColor()
weak var weak_R = color_R
weak var weak_G = color_G
weak var weak_B = color_B
Run Code Online (Sandbox Code Playgroud)