以下是Foundation应用程序中的两段Objective-C代码.这段代码在一个函数中:
[arrayOfObjects addObject:[[TheShape alloc] init]];
NSLog(@"%@", arrayOfObjects); // log verifies "<TheShape..." is in the array
[arrayOfObjects release];
Run Code Online (Sandbox Code Playgroud)
在我的TheShape类中,我有这个dealloc覆盖方法:
- (void)dealloc {
NSLog(@"TheShape dealloc called.");
[super dealloc];
}
Run Code Online (Sandbox Code Playgroud)
虽然我的程序不起作用,但它并不像我期望的那样工作.当[arrayOfObjects release]发送消息时,我希望看到的"TheShape的dealloc ..."字符串出现在日志中.它没有.
Q1:为什么不呢?
所以我挖了一些并简化了一些事情.如果我做一些更简单的事情:
TheShape *aShape = [[TheShape alloc] init];
[aShape release];
Run Code Online (Sandbox Code Playgroud)
调试消息仍未出现在日志中.
Q2:为什么不呢?
但如果我这样做:
TheShape *aShape = [TheShape new];
[aShape release];
Run Code Online (Sandbox Code Playgroud)
调试消息确实出现在日志中.如果我将第一个样本中的alloc/init更改为,则调试消息也会出现在日志中new.
Q3:为什么?
很显然,我失去了一些东西在分配/初始化/释放周期概念(Q的1和2),并在假想的等效new和alloc/init(Q3).任何人都可以指点我的教程,对于像我这样难以思考的事情来解释一下吗?
谢谢,
法案
我是C和Objective C的新手,但我找不到这个答案
所以我遇到了一个问题,花了我一段时间来解决问题,基本上我被告知,当你分配一个对象时,你应该释放它.这就是我所做的,它导致我的程序崩溃......
这是代码:
NSString *numberString = [[NSString alloc] init];
numberString = resultLabel.text;
[self setFirstNumber:[numberString doubleValue]];
[resultLabel setText:@"0"];
[numberString release];
Run Code Online (Sandbox Code Playgroud)
我想我弄清楚为什么它是因为"numberString = resultLabel.text"行,但我不明白为什么程序崩溃了.为什么我不能发布numberString?如果我不这样做会导致内存泄漏吗?
PS我知道代码很笨,我是编程的新手,而且是Objective C的超级新手.
PSS我稍后在 - (void)dealloc {}中发布resultLabel
如果我这样做
Object * myObject = [[Object alloc]init];
[myObject release];
Run Code Online (Sandbox Code Playgroud)
在下一行分配我的对象有什么不对
myObject = [[Object alloc]init];
Run Code Online (Sandbox Code Playgroud)
再次?
我一直在浏览Objective-C中的一些教程,当涉及到命令alloc()以及它如何用于初始化对象时,我感到很困惑.
该教程说要做以下事情,我无法弄清楚为什么有必要.
更改
NSDate *now = [NSDate date];
Run Code Online (Sandbox Code Playgroud)
至
NSDate *now = [[NSDate alloc] init];
Run Code Online (Sandbox Code Playgroud)
为什么这个改变是必要的,因为第一行工作得很好?我想我正在寻找两条线的差异.谢谢!
我已经搜索了与我有类似问题的其他人,但他们的代码都与我大不相同。
当我用 g++ 编译以下代码时,出现错误:
篮子OOP: malloc.c:2451: sSYSMALLOc: 断言`(old_top == (((mbinptr) (((char *) &((av)->bins[((1) - 1) * 2])) - __builtin_offsetof (struct malloc_chunk, fd)))) && old_size == 0) || ((unsigned long) (old_size) >= (unsigned long)(((((__builtin_offsetof (struct malloc_chunk, fd_nextsize))+((2 * (sizeof(size_t))) - 1)) & ~((2 * (sizeof) (size_t))) - 1))) && ((old_top)->size & 0x1) && ((unsigned long)old_end & pagemask) == 0)' 失败。中止(核心转储)
我从不使用 free() 或类似的函数,所以我认为这不是问题所在。
当我通过 valgrind 运行我的代码时,我得到“大小为 4 的无效写入”。然后是一些我不完全理解的胡言乱语,我认为我认为是 Player 构造函数。
对于那些想知道这是一个篮球模拟程序的人,我正在为一项任务编写它以帮助学习和理解 OOP,所以显然我不是要你为我编写我的代码,这只是我以前从未遇到过的错误并且需要修复它才能继续分配。
ps:抱歉没有评论,我还没有解决这个问题:/ pps:格式可能看起来很奇怪,因为我必须缩进代码才能让它全部显示为代码
感谢任何提前提供帮助的人!
#include <iostream>
#include <time.h>
#include <string> …Run Code Online (Sandbox Code Playgroud) 在C99中,您可以通过这种方式简单地初始化静态分配的结构
struct sometype {
int a;
double b;
};
sometype a = {
.a = 0;
};
Run Code Online (Sandbox Code Playgroud)
好吧,这不适用于像这样的堆上的结构.
struct sometype *a = malloc(sizeof(struct sometype));
*a = {
.a = 0;
};
Run Code Online (Sandbox Code Playgroud)
使用GCC 4.9.2,编译器抱怨
error: expected expression before '{' token
Run Code Online (Sandbox Code Playgroud)
我知道这很愚蠢,但是有什么语法或技术原因我不能这样做吗?
我试图转换这为迅速。
内存分配逻辑面临的问题
Byte *p[10000];
p[allocatedMB] = malloc(1048576);
memset(p[allocatedMB], 0, 1048576);
Run Code Online (Sandbox Code Playgroud)
如何快速写这个?
对不起,我不能具体代码,但我看到的问题是异常的.字符串值似乎正在根据其他不相关的代码进行更改.例如,下面传递的参数值只会根据我是否注释掉一个或两个fprintf()调用而改变!通过最后一个fprintf(),该值通常是完全空的(不,我已经检查以确保我没有直接修改参数...我所要做的就是注释掉fprintf()或添加另一个fprintf()并且字符串的值将在某些点发生变化!):
static process_args(char *arg) {
/* debug */
fprintf(stderr, "Function arg is %s\n", arg);
...do a bunch of stuff including call another function that uses alloc()...
/* debug */
fprintf(stderr, "Function arg is now %s\n", arg);
}
int main(int argc, char *argv[]) {
char *my_arg;
... do a bunch of stuff ...
/* just to show you it's nothing to do with the argv array */
my_string = strdup(argv[1]);
/* debug */
fprintf(stderr, "Argument 1 is %s\n", my_string);
process_args(my_string);
} …Run Code Online (Sandbox Code Playgroud) 我是否通过以下方式创建多个内存泄漏:
NSMutableArray *array=[[NSMutableArray alloc] init];
[array addObject:[[NSNumber alloc] initWithBool:boolVariable1]];
[array addObject:[[NSNumber alloc] initWithBool:boolVariable2]];
[array addObject:[[NSNumber alloc] initWithInt:intVariable]];
[array addObject:[[NSNumber alloc] initWithFloat:floatVariable]];
[array writeToFile:[self dataFilePath] atomically:YES];
[array release];
Run Code Online (Sandbox Code Playgroud)
使用起来更好:
[array addObject:[NSNumber numberWithInt:intVariable]];
Run Code Online (Sandbox Code Playgroud) 我是ObjC和iPhone的新手.
我下载了多个视图之间的数据共享示例.基本方法是在基础UIApplication中创建数据模型对象,并从/向其获取/设置数据.所以在init方法中我看到了以下代码:
- (id) init;
{
self.theAppDataObject = [[ExampleAppDataObject alloc] init];
[theAppDataObject release];
return [super init];
}
Run Code Online (Sandbox Code Playgroud)
然后,使用委托我们可以访问此对象.
id theDelegate = (id) [UIApplication sharedApplication].delegate;
ExampleAppDataObject* theDataObject;
theDataObject = (ExampleAppDataObject*) theDelegate.theAppDataObject;
Run Code Online (Sandbox Code Playgroud)
所以,我的问题出在第一个代码示例中.为什么我们需要为theAppDataObject对象分配内存,然后立即释放对象?为什么我们以后在访问这个对象时会得到nil?
10倍