这是关于内存泄漏的一般问题.假设您有以下代码:
NSObject *object = [[NSObject alloc] init];
NSArray *array = [[NSArray arrayWithObjects:object] retain];
[object release];
[array release];
Run Code Online (Sandbox Code Playgroud)
这是内存泄漏吗?比如,我是否必须枚举数组中的所有对象并在释放整个数组之前逐个释放它们?或者NSArray的dealloc方法是否释放其中的所有对象以及释放数组本身?
谢谢你的帮助!内存管理可能非常棘手.
在没有任何见解的情况下搜索网页后,我决定在这里发布我的问题,希望有人可以解释下面的代码有什么问题.我只是无法在Objective-C中实现单例设计模式.我发现了一些在互联网上实现模式的代码,并对其进行了一些修改以添加从plist文件启动的字典(其中属性列表中的每个条目本身都是字典):
@interface UnitManager : NSObject {
NSString *someProperty;
NSDictionary *factors;
}
@property (nonatomic, retain) NSString *someProperty;
@property (nonatomic, retain) NSDictionary *factors;
+ (id) sharedUnitManager;
@end
// implementation file
#import "Unit.h"
#define MARGIN 20
static UnitManager *unitManager = nil;
@implementation UnitManager
@synthesize someProperty;
@synthesize factors;
#pragma mark Singleton Methods
+ (id)sharedUnitManager {
@synchronized(self) {
if(unitManager == nil)
unitManager = [[super allocWithZone:NULL] init];
}
return unitManager;
}
+ (id)allocWithZone:(NSZone *)zone {
return [[self sharedUnitManager] retain];
}
- (id)copyWithZone:(NSZone *)zone {
return self; …Run Code Online (Sandbox Code Playgroud) singleton memory-management objective-c nsdictionary nsmutabledictionary
任何人都可以解释为什么这行代码的保留计数:
[[[SomeClass alloc] init] retain]
Run Code Online (Sandbox Code Playgroud)
是两个?我只打电话给保留一次.
我在codepad.org和ideone.com上尝试了以下代码:
char* ptr = new char;
free( ptr );
Run Code Online (Sandbox Code Playgroud)
是的,我知道这是未定义的行为,但我想编译并运行它以查看会发生什么.
Visual C++ 10编译它,但在上述网站上使用的gcc说
错误:在'('标记之前)的预期构造函数,析构函数或类型转换
为什么这个代码不能用gcc编译,我怎么能让它编译?
在我的一个函数中,我有一个while循环,它可能需要临时创建一个对象.我的代码看起来像这样:
while(c < end){
if(specialCase){
Object *myObject = [Object alloc];
//do stuff with myObject
//I tried [myObject dealloc] here, but it crashed when this method was called.
}
c++;
}
Run Code Online (Sandbox Code Playgroud)
代码工作正常,但我担心内存泄漏.我想知道是否以及如何释放myObject.
例如:
@interface DataMode : NSObject {
NSString * name;
}
@property (nonatomic, retain) NSString * name;
@end
Run Code Online (Sandbox Code Playgroud)
将编译器自动添加[name release]到-dealloc?
- (void) dealloc
{
[name release]; // if we don't add it , will the compiler add "[name release]"???
[super release];
}
Run Code Online (Sandbox Code Playgroud) 我在看过去几年的C考试,我遇到了一个我不太了解的问题.他们提供了一段简单的代码,并询问了内存中不同变量的位置.选项是heap stack和unknows.我知道在堆栈中初始化的自动变量,以及动态分配的变量都在堆中.
那么,第一个问题 - 什么是未知的?
对于第二个问题,这里的代码和表格的答案正确:
#include <string.h>
#include <stdlib.h>
typedef struct
{
char *_str;
int _l;
} MyString;
MyString* NewMyString (char *str)
{
MyString *t = (MyString *) malloc (sizeof (MyString)); //LINE 12
t->_l = strlen (str);
t->_str = (char*) malloc (t->_l + 1);
strcpy (t->_str, str);
return t;
}
int main()
{
MyString ** arr = (MyString**) malloc (sizeof (MyString*)*10); //LINE 21
int i;
for (i=0;i<10;i++)
{
arr[i] = NewMyString ("item"); //LINE 25
} …Run Code Online (Sandbox Code Playgroud) 当我分析我的项目但项目没有崩溃时,我收到一个死店警告.这就是我在做的事情
NSString *graphUrl = nil;
if ([graphArray count] == 1)
{
objTrial = [graphArray objectAtIndex:0];
graphUrl = @"http://chart.apis.google.com/chart?cht=s:nda&chf=bg,s,FFFFFF&chs=";
graphUrl = [graphUrl stringByAppendingString:@"&chd=t:"];
graphUrl = [graphUrl stringByAppendingString:objTrial.highValue];// get the dead store error here
}
else
{
//someother operation is done and a value is loaded to aURL
}
Run Code Online (Sandbox Code Playgroud)
我在代码中提到了一个死店警告.我怎么能阻止这个?
如果有人能帮我解决这个问题会很棒
由于过度释放,我看起来像是崩溃,但据我所知,我没有做错任何事情,但是我可能对AutoreleasePools和类变量有错误的想法.
如果我有一个类变量:
UIImageView *imageView;
Run Code Online (Sandbox Code Playgroud)
我在一个这样的线程中分配它:
- (void)setupThreaded {
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
UIImage *image = [UIImage imageNamed:@"myimage.png"];
imageView = [[UIImageView alloc] initWithImage:image];
[self performSelectorOnMainThread:@selector(addViewOnMainThread) withObject:nil waitUntilDone:YES];
[pool release];
}
- (void)addViewOnMainThread {
[self.view addSubView:imageView];
}
Run Code Online (Sandbox Code Playgroud)
我目前偶尔会收到一个错误,提示imageView过早释放或者imageView的图像过早释放.
可能导致什么?
背景:我有一个2类A和B.A类包含1个int64,1个int,1个datetime,6个字符串,1个字节[]和一个B类对象列表.
B类包含2个Int64,1个枚举(4个值),5个字符串.
A类和B类之间具有主要的细节关系.A类的列表中可以有0个或更多B类对象.
这些对象用于存储我们的数据库的搜索结果.
我们有一个SOA架构.客户端可以使用特定日期范围和一组固定标准进行搜索.我们在服务上使用这些来收集搜索结果并将它们分批推送到客户端.发送每个批次后,我们从服务中删除这些对象.
问题:如果用户进行的搜索返回200k结果(A类+ B类组合计数),则服务内存消耗将跳跃200mb.但是,如果后续搜索仅返回少量结果,则内存不会返回其先前的状态.当我查看服务的性能计数器时,我发现gen2对象占用了大量内存.
在不尝试执行GC.Collect()的情况下,如何确保更快地返回内存?我虽然在A类和B类上使用IDisposable接口,但由于它们中的大多数字段都是字符串,我不知道如何强制处理它们.
ios ×5
objective-c ×5
iphone ×3
memory-leaks ×2
.net ×1
c ×1
c# ×1
c++ ×1
dealloc ×1
gcc ×1
ios4 ×1
memory ×1
nsdictionary ×1
nsstring ×1
performance ×1
properties ×1
retain ×1
singleton ×1
xcode ×1