__blockObjective-C 中的关键字究竟是什么意思?我知道它允许你修改块内的变量,但我想知道......
在xcode中收集KVC访问器片段非常方便,因为它们很难手工完成.有没有人一直在使用4一段时间了解如何添加新的?
(...我们现在可以谈谈了,对吧?)
我在UINavigationController中推送和弹出ViewControllers.
我正在跟踪我的应用程序的内存消耗.在推送新的viewController时,内存消耗逐渐增加,但是当我使用[self.navigationController popViewControllerAnimated:NO];内存消耗弹出相同的ViewController时,不会减少而是常量.
用户可以多次推送和弹出特定的viewController,这会导致应用程序在RAM中的高内存消耗.
我该怎么做才能优化我的内存消耗?
我已经读完了这个帖子:"__block"关键字是什么意思?讨论了什么__block用于但我对其中一个答案感到困惑.它说__block是用来避免保留周期,但它下面的评论让我不确定.
我正在使用这样的东西:
self.someProperty = x; //where x is some object (id)
__block __weak VP_User *this = self;
//begin a callback-style block
this.someProperty = nil;
Run Code Online (Sandbox Code Playgroud)
我需要同时使用__block和__weak?看起来这种方式有什么明显的问题吗?
我正在iPod touch设备上运行我的iOS应用程序,即使总分配峰值仅为7 MB,我也会收到内存警告,如下所示(当按下游戏场景时会发生这种情况):

什么我觉得奇怪的是:
在左峰(在时间0.00),对应于20 MB的内存分配(简介场景),尽管这并没有给出任何内存警告.
的中心峰(在时间35.00)对应于raughly 7 MB的所分配的存储器(游戏场景正在被推动)和DOES给存储器的警告.
如果总内存只有7 MB,我不明白为什么会收到这些警告.这是正常的吗?我怎么能避免这个?

查看分配密度,我们可以看到以下模式,对于我来说,在推动介绍场景的时刻(0.00)与推动游戏场景的时刻(35.00)之间没有显示出太大差异.由于密度峰值相似,我认为记忆警告是由于我无法发现的其他东西.
编辑:
我一直在遵循建议使用"活动监视器",但不幸的是我的应用程序在加载游戏场景时崩溃,只分配了30 MB的内存.这是活动监视器报告.

查看报告,我可以看到总实际内存使用量总和约为105 MB.鉴于这应该参考RAM内存并且鉴于我的模型应该有256 MB的RAM,这不应该导致APP崩溃或内存泄漏问题.
我运行Leak监视器,它在我的应用程序上没有显示任何泄漏.我也杀死了所有其他应用程序.
但是,在分析报告时,我看到与我的应用程序相关的惊人的167 MB虚拟内存值.这是正常的吗?这个值意味着什么?这可能是坠机的原因吗?如何检测代码的哪些区域对此负责?

我的iPod是第四代机型,容量为6.4 GB(内存),只有290 MB无内存.我不确定这是否会以某种方式影响虚拟内存分页性能.
编辑2:我也更注重SpringBoard,其虚拟内存使用量为180 MB.这是正常的吗?我发现一些问题/答案似乎表明SpringBoard负责自动释放对象(它应该是管理屏幕和主页的过程,但我不确定它是否也与内存管理有关).它是否正确?
另一个说明.我正在使用ARC.但是我不确定这对问题有多大帮助,因为没有明显的内存泄漏,XCode应该转换代码,将release/dealloc/retain调用添加到已编译的二进制文件中.
编辑3:如前所述我使用ARC和Cocos2d(2.0).我一直在玩Activity监视器.我发现如果我删除了GameCenter身份验证机制,那么Activity Monitor运行正常(新疑点:是否有其他人遇到过类似问题?GameCenter身份验证视图是否保留在某处?).但是我注意到每次我在GameScene(初始场景 - >角色选择 - >行星选择 - >角色选择 - >行星选择 - >等等 - >字符选择......)之前的各种场景中前后导航.REAL MEMORY使用量增加.过了一会儿,我开始得到内存警告,应用程序被iOS杀死.现在的问题是:
- >我是以正确的方式更换场景吗?我从各种场景中调用以下内容:
[[CCDirector sharedDirector] replaceScene: [MainMenuScene scene]];
Run Code Online (Sandbox Code Playgroud)
我有Cocos2d 2.0作为静态库,replaceScene的代码是这样的:
-(void) …Run Code Online (Sandbox Code Playgroud) 我是编程和Objective-C的新手,我正在尝试解决我的代码有什么问题.我已经阅读了一些关于块的内容,但我不知道到目前为止我所阅读的内容与我的代码有什么关系.
我的代码使用的是iOS 5 Twitter Framework.我使用Apple提供的大多数示例代码,所以我实际上一开始并不知道我使用了一个块作为完成处理程序.
现在我从Xcode 4获得了这两条消息:" 1.块将被捕获对象强烈保留的对象保留 ",并且" 在此块中捕获'自我'可能会导致保留周期 ".
基本上,我所做的是删除Apple在其完成处理程序中使用的代码(使用TWTweetComposeViewControllerResultCancelled和TWTweetComposeViewControllerResultDone的switch语句)并使用我的if语句[imagePickerController sourceType].
因此,sendTweet在将图像添加到推文后调用.
我希望有人可以向我解释为什么会这样,以及我如何解决它.另外:我可以将完成处理程序代码放入方法而不是块中吗?
- (void)sendTweet:(UIImage *)image
{
//adds photo to tweet
[tweetViewController addImage:image];
// Create the completion handler block.
//Xcode: "1. Block will be retained by an object strongly retained by the captured object"
[tweetViewController setCompletionHandler:
^(TWTweetComposeViewControllerResult result) {
NSString *alertTitle,
*alertMessage,
*otherAlertButtonTitle,
*alertCancelButtonTitle;
if (result == TWTweetComposeViewControllerResultCancelled)
{
//Xcode: "Capturing 'self' strongly in this block is likely to lead to a retain cycle" …Run Code Online (Sandbox Code Playgroud) 参考:
就像上面说的链接一样,但似乎并没有解释原因.
在我的代码中,以下内容将起作用:
dispatch_async(dispatch_get_main_queue(), ^{
[self performSelector: @selector(helloWorld) withObject:nil afterDelay:0.5];
});
Run Code Online (Sandbox Code Playgroud)
但是,当我评论这样的事情时,(我确信我在主线程中运行它!!)代码不起作用:
// dispatch_async(dispatch_get_main_queue(), ^{
[self performSelector: @selector(helloWorld) withObject:nil afterDelay: 0.5];
// });
Run Code Online (Sandbox Code Playgroud)
有人可以告诉我为什么吗?和 '自我',将神经释放/解除分配,我保留它直到申请结束.
"不工作",意味着,(没有崩溃)它不会跳转到"helloWorld"方法:
-(void) helloWorld {
NSLog(@"hello world"); // I set a break point here for debug , it wouldn't pause forever
}
Run Code Online (Sandbox Code Playgroud)
我认为Run Loop会导致这个问题.喜欢这个链接说,但我需要更多细节或更明确的解释.
这不是一个问题,更多的是我在Apple提供的针对iOS4和5相机操作提供的AVCam示例代码周围发现的内容的记录.对我来说问题的症状是我的应用程序在拍摄5-10张照片后启动AVCamViewController时会崩溃.
我通过内存泄漏分析器运行应用程序并且没有明显的泄漏但是在使用Activity Monitor检查时我发现每次启动摄像头时称为mediaserverd的东西增加了17Mb,当它达到~100Mb时,应用程序崩溃了多个低记忆警告.
所以我正在阅读如何在实现API时避免在块中捕获自身?关于内存管理如何在完成块中引用self并且让我思考:以下内容是否会导致保留周期?
伪代码:
[AFnetworking requestGet:@"http://www.website.com" completionBlock:(^)(RequestObj* request, NSError* error){
[self.tableView reloadData];
}];
Run Code Online (Sandbox Code Playgroud)
忽略语法问题,self.tableView会导致保留周期吗?是否有必要做以下事情?
__weak id weakSelf = self;
[AFnetworking requestGet:@"http://www.website.com" completionBlock:(^)(RequestObj* request, NSError* error){
[weakSelf.tableView reloadData];
}];
Run Code Online (Sandbox Code Playgroud)
或者AFNetworking是否有某种记忆魔法可以阻止这种情况?
编辑Aaron Brager的礼貌
这里没有保留周期.但是如果你这样做了,在完成块中,你应该将weakSelf转换回一个强引用,这样它就不会在你的完成块中途被解除分配.
id strongSelf = weakSelf;
[strongSelf.tableView reloadData];
Run Code Online (Sandbox Code Playgroud) 假设我有一个anInstance具有属性的类的实例aProperty.当我anInstance.aProperty在块中使用时,块是否捕获(指针)值,anInstance然后将aProperty消息发送到捕获的(指针)值,或者块只捕获值anInstance.aProperty?
我AFNetworking在我的项目中使用,但它有2个警告:

完整的警告字符串是:
/AFNetworking/AFHTTPClient.m:575:38: Capturing 'operation' strongly in this block is likely to lead to a retain cycle
objective-c ×7
ios ×5
afnetworking ×2
iphone ×2
xcode ×2
avcam ×1
cocoa ×1
ios5 ×1
ipad ×1
memory-leaks ×1
uitableview ×1
warnings ×1
xcode4 ×1