在大多数情况下使用ARC(自动引用计数),我们不需要考虑使用Objective-C对象的内存管理.不允许再创建NSAutoreleasePools,但是有一个新的语法:
@autoreleasepool {
…
}
Run Code Online (Sandbox Code Playgroud)
我的问题是,当我不应该手动释放/自动释放时,为什么我需要这个呢?
编辑:总结我从所有的答案和评论中得到的简洁:
新语法:
@autoreleasepool { … } 是新的语法
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
…
[pool drain];
Run Code Online (Sandbox Code Playgroud)
更重要的是:
autorelease以及release.@autoreleasepool:
myRunLoop(…) { @autoreleasepool { … } return success; }.memory-management objective-c xcode4.2 automatic-ref-counting
谁能解释一下是NSRunLoop什么?所以我知道这NSRunLoop是一件与之相关的事情NSThread吗?所以假设我创建一个类似的线程
NSThread* th=[[NSThread alloc] initWithTarget:self selector:@selector(someMethod) object:nil];
[th start];
-(void) someMethod
{
NSLog(@"operation");
}
Run Code Online (Sandbox Code Playgroud)
在这个线程完成他的工作之后?为什么使用RunLoops或在哪里使用?从Apple docs我已经阅读了一些东西,但对我来说并不清楚,所以请尽可能简单地解释
我想从文件系统将一些图像加载到我的应用程序中.有两种简单的方法可以做到这一点:
[UIImage imageNamed:fullFileName]
Run Code Online (Sandbox Code Playgroud)
要么:
NSString *fileLocation = [[NSBundle mainBundle] pathForResource:fileName ofType:extension];
NSData *imageData = [NSData dataWithContentsOfFile:fileLocation];
[UIImage imageWithData:imageData];
Run Code Online (Sandbox Code Playgroud)
我更喜欢第一个,因为它的代码少得多,但是我看到有些人说图像被缓存了,而且这个方法使用了更多的内存?由于我不相信大多数其他论坛上的人,我想我会在这里问这个问题,是否有任何实际的区别,如果是的话哪个更"好"?
我尝试使用对象分配工具分析我的应用程序,我看不出任何实际差异,虽然我只在模拟器中尝试过,而不是在iPhone本身上.
如果我有一个像UILabel链接到xib文件的东西,我是否需要在我的视图dealloc上发布它?我问的原因是因为我没有分配它,这让我觉得我不需要释放它?例如(在标题中):
IBOutlet UILabel *lblExample;
Run Code Online (Sandbox Code Playgroud)
在实施中:
....
[lblExample setText:@"whatever"];
....
-(void)dealloc{
[lblExample release];//?????????
}
Run Code Online (Sandbox Code Playgroud) 这个问题是对以下内容的扩展:
Link-1:从ios表面创建图像并保存它
Link-2:从iOS应用程序中截取屏幕截图 - 模拟显示记录器(在内部查询)
(参考链接-1)我有在后台工作时截取屏幕截图的代码.但如上所述,它需要2秒的睡眠才能不间断地工作,否则操作系统会暂停应用程序.我想出原因可能是我没有明确发布我创建的IOSurface.
原因 - 使用Victor Ronin给出的链接http://pastie.org/pastes/3734430,即使没有睡眠,捕获也能正常工作.在我每次写入图像后,我尝试使用CFRelease释放destSurf(我创建的目标表面),但这不起作用.
任何有关何时,如何以及是否发布创建的IOSurface的帮助都将非常有用.谢谢.
更新
所以,这就是确切发生的事情.(参考链接-1)
IOSurfaceRef destSurf = IOSurfaceCreate(dict);
IOSurfaceAcceleratorRef outAcc;
IOSurfaceAcceleratorCreate(NULL, 0, &outAcc);
CFDictionaryRef ed = (__bridge CFDictionaryRef)[NSDictionary dictionaryWithObjectsAndKeys: nil];
IOSurfaceAcceleratorTransferSurface(outAcc, screenSurface, destSurf, ed, NULL);
IOSurfaceUnlock(screenSurface, kIOSurfaceLockReadOnly, &aseed);
CGDataProviderRef provider = CGDataProviderCreateWithData(NULL, IOSurfaceGetBaseAddress(destSurf), (width*height*4), NULL);
CGImageRef cgImage=CGImageCreate(width, height, 8, 8*4, IOSurfaceGetBytesPerRow(destSurf), CGColorSpaceCreateDeviceRGB(), kCGImageAlphaNoneSkipFirst | kCGBitmapByteOrder32Little, provider, NULL, YES, kCGRenderingIntentDefault);
UIImage *image = [UIImage imageWithCGImage: cgImage];
CGImageRelease(cgImage);
UIImageWriteToSavedPhotosAlbum(image, self, nil, nil);
CFRelease(destSurf);
Run Code Online (Sandbox Code Playgroud)
请建议解决iphone上内存泄漏问题的最佳方法.释放,自动释放,保留的最佳用途是什么,哪些适用于哪些情况?
在objective-c中你看到了
[object retain] ;
向retain对象发送消息意味着什么,为什么要使用它?
我想知道以下是什么意思.我要发布它吗?我没有为它分配内存.方法也是类方法.有帮助吗?
object = [[class method] retain];
Run Code Online (Sandbox Code Playgroud) 使用iPhone上的obj-c,自动释放所有内容而不是释放是否有任何伤害?
例如,这段代码:
NSString *recipe = [[NSString alloc] initWithUTF8String:sqlite3_column_text(dbps,0)];
[arr addObject:recipe];
[recipe release];
Run Code Online (Sandbox Code Playgroud)
当我创建它时,可以通过自动释放配方nsstring缩短为两行:
NSString *recipe = [[[NSString alloc] initWithUTF8String:sqlite3_column_text(dbps,0)] autorelease];
[arr addObject:recipe];
Run Code Online (Sandbox Code Playgroud)
这有什么缺点吗?我发现它更适合我的编码风格.谢谢大家.
我经常看到类似的东西:
NSArray *tmpArr = [[NSArray alloc] initWithObjects:@"Info", nil];
self.userInfo = tmpArr;
[tmpArr release];
Run Code Online (Sandbox Code Playgroud)
代替:
self.userInfo = [[NSArray alloc] initWithObjects:@"Info", nil];
Run Code Online (Sandbox Code Playgroud)
有谁知道为什么顶级代码样本更受欢迎?内存管理比第二个更准确吗?
Ubuntu 10.10 gcc 4.4.4
我只是在尝试分配和释放.
但是,当一个对象被多次释放时,我试图避免这个问题.
但是,当我测试时,我注意到创建和释放的obj没有返回到null状态.那么有什么条件我可以设置,如果这确实发生将避免?
我也试过在free之后将对象设置为NULL.但是,它仍然试图释放该对象.
这是对这个问题的引用,只是让你知道不重复: 释放已分配的内存
我的代码如下:
#include <stdio.h>
#include "objects.h"
int main(void)
{
obj_t *obj = NULL;
obj = create_object();
destroy_object(obj);
destroy_object(obj);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
==
#ifndef OBJECTS_H_INCLUDED
#define OBJECTS_H_INCLUDED
typedef struct Obj_t obj_t;
obj_t* create_object();
void destroy_object(obj_t *obj);
#endif /* OBJECTS_H_INCLUDED */
Run Code Online (Sandbox Code Playgroud)
==
#include <stdio.h>
#include <stdlib.h>
#include "objects.h"
struct Obj_t {
int obj_id;
};
obj_t* create_object()
{
obj_t *obj = malloc(sizeof obj);
return obj;
}
void destroy_object(obj_t *obj)
{
if(obj != NULL) { …Run Code Online (Sandbox Code Playgroud) 我有一个方法,不要使用ARC:
-(void)readAppPlist
{
NSString *plistPath = [self getDataFileDestinationPath];
NSData *plistXML = [[NSFileManager defaultManager] contentsAtPath:plistPath];
NSString *errorDesc = nil;
NSPropertyListFormat format;
NSMutableDictionary *temp = (NSMutableDictionary *) [NSPropertyListSerialization propertyListFromData:plistXML mutabilityOption:NSPropertyListMutableContainersAndLeaves format:&format errorDescription:&errorDesc];
if (!temp) {
NSLog(@"Error reading plist: %@, formatL %d", errorDesc, format);
}
items = [[temp objectForKey:@"Items"] mutableCopy];
}
Run Code Online (Sandbox Code Playgroud)
根据内存管理规则,我需要为变量plistPath,plistXML,errorDesc,temp释放内存?我应该另外一个方法,在这里发布它们或者只是将它们放入这个类的dealloc全局方法中吗?
objective-c ×7
ios ×5
iphone ×5
cocoa-touch ×3
c ×1
free ×1
ios4 ×1
ios5 ×1
ios6 ×1
malloc ×1
memory-leaks ×1
nsrunloop ×1
xcode4.2 ×1