在Mac和iOS平台上,内存泄漏通常是由未发布的指针引起的.传统上,检查您的分配,副本和保留以确保每个都有相应的发布消息始终是至关重要的.
Xcode 4.2附带的工具链引入了最新版本的LLVM编译器的自动引用计数(ARC),通过让编译器为您的内存管理来完全解决这个问题.这非常酷,它确实减少了大量不必要的,平凡的开发时间,并防止了很多粗心的内存泄漏,这些泄漏很容易通过适当的保留/释放平衡来修复.当您为Mac和iOS应用程序启用ARC时,甚至需要以不同方式管理自动释放池(因为您不应再分配自己的NSAutoreleasePools).
但是,其他的内存泄漏它不能阻止我仍然要注意?
作为奖励,Mac OS X和iOS上的ARC与Mac OS X上的垃圾收集有什么区别?
我知道的定义unsafe_unretained.
所以我不希望任何人写出它的定义.
我想知道它在示例中的用法,以及它如何与内存管理一起使用.
我有一个项目,其中包含一些使用ARC的文件,有些则没有.那些没有禁用ARC的编译器标志的那些.这很好.
我还想确保我的库编译LLVM-GCC和LLVM编译器.
我有这样的房产:
@property (strong, nonatomic) NSString *foo;
Run Code Online (Sandbox Code Playgroud)
但是,当我在LLVM-GCC中编译时,我得到:
"在'强'之前预期属性属性"
如果我改变强势保留,它编译好.Strong在LLVM编译器中也可以正常工作.
我错过了什么?保留不是强有力的代名词吗?
我正在编写一个工具,可以从知道哪个类的实例变量被声明中受益__weak.
这些信息必须存在于运行时的某个地方,但有没有办法访问它,记录或以其他方式?(这是一个工具,所以我不太关心它打破更新)
我正在尝试一个简单的例子,如下所示:https: //developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programming_Language/AutomaticReferenceCounting.html#//apple_ref/doc/uid/TP40014097-CH20 -XID_88
这是我的代码.(忽略其他可能的代码,这是一个空项目,此代码写在空的UIViewcontroller viewDidLoad中)
dispatch_async(dispatch_get_main_queue()) {
[unowned self] in
println(self)
}
Run Code Online (Sandbox Code Playgroud)
我不明白为什么当我运行专业版时它会崩溃
- 线程#1:tid = 0x1a796,0x00284d18 libswiftCore.dylib`_swift_release_slow + 8,queue ='com.apple.main-thread',stop reason = EXC_BAD_ACCESS(code = 1,address = 0x458bc681)
在最新的测试版(5)上有什么变化,这是不再支持的吗?谢谢
编辑:有趣的是这段代码适用于Objc
__weak MyViewController *weakSelf = self;
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"%@", weakSelf);
});
Run Code Online (Sandbox Code Playgroud)
edit2:关于这个链接的解释:我们总是在Swift中使用[无主自我]内部关闭弱和无主的区别是错误的.
这不仅仅是弱小的nils而且是无主的.如果是这种情况,这也应该崩溃:
dispatch_async(dispatch_get_main_queue()) {
[weak self] in
println(self)
}
Run Code Online (Sandbox Code Playgroud)
但它没有,它打印指针,所以,它不是零.
在我支持iOS ARC的代码中,我需要将"self"和其他对象传递给一个块.更具体地讲,我需要与自我和互动ASIHTTPRequest内部对象ASIHTTPRequest的completionBlock.
_operation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(parseServerReply) object:nil];
_request = [ASIHTTPRequest requestWithURL:@"server.address"];
// ...
[_request setCompletionBlock:^{
[self setResponseString:_request.responseString];
[[MyAppDelegate getQueue] addOperation:_operation];
}];
Run Code Online (Sandbox Code Playgroud)
为了避免以下警告:Capturing "self" strongly in this block will likely lead to a retain cycle.我已经修改了我的代码,以便__weak在此帖子之后添加属性块中使用的对象:修复警告"在此块中强烈捕获[一个对象]可能会导致保留周期"在启用ARC的代码中
结果代码是:
_operation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(parseServerReply) object:nil];
_request = [ASIHTTPRequest requestWithURL:@"server.address"];
// ...
__weak NSOperation * operation = _operation;
__weak ASIHTTPRequest * request = _request;
__weak typeof(self) * self_ = self;
[request …Run Code Online (Sandbox Code Playgroud) 模糊的概述是我正在一个NSArray类别中编写一个方法,该方法将Class一个Array过滤到属于该类成员的元素.就像是:
@implementation NSArray(filter)
-(NSArray*)objectsOfClass:(Class)aClass {
NSMutableArray *ret = [[NSMutableArray alloc] init];
for (id obj in self)
if ([obj isMemberOfClass:aClass])
[ret addObject:obj];
return [NSArray arrayWithArray:ret];
}
@end
Run Code Online (Sandbox Code Playgroud)
Sooo,除此之外,我的问题.NSObject.h显示isMemberOfClass:具有以下签名:
-(BOOL)isMemberOfClass:(Class)aClass;
Run Code Online (Sandbox Code Playgroud)
当我在XCode中键入此方法时,自动完成提示方法签名如下所示:
[self isMemberOfClass:(__unsafe_unretained Class)]
Run Code Online (Sandbox Code Playgroud)
我的问题是:
1)为什么NSObject.h中的方法原型和XCode的自动完成之间存在差异?
2)在我自己的方法中(在这个问题的开头显示),我应该包含__unsafe_unretained修饰符吗?如果是这样,为什么?如果没有,为什么不呢?
谢谢!
我正在尝试创建一个结构,其中包含几个不同类型的不同变量.
有几种类型是NSString,但尝试这样做会导致错误
ARC forbids Objective-C objects in structs or unions
所以阅读有关错误,我认为添加是明智的
__unsafe_unretained
Run Code Online (Sandbox Code Playgroud)
在NSString声明之前,但我不知道这会产生什么后果,我已经快速阅读并发现了这篇关于差异的详细帖子
然而,在一个结构中使用了__unsafe_unretained并且希望有人可以告诉我发生了什么以及我将来需要考虑的关于内存和阻止任何泄漏的内容,这仍然是模糊的.
任何帮助,将不胜感激.
ios ×6
iphone ×4
objective-c ×3
cocoa ×1
cocoa-touch ×1
ios5 ×1
macos ×1
memory-leaks ×1
nsstring ×1
struct ×1
swift ×1
xcode ×1