只是好奇是否仍然使用NSLog显示对象保留计数.我只想将它们打印到控制台,以帮助了解保留/释放如何在一些简单的代码中工作?
干杯 - 加里 -
我已经使用ojective近一个星期了,我主要是一个c ++编码器.在我阅读了Apple的内存管理指南之后,我尝试将c ++中的内存使用方式带入目标c ...我试图总结这些场景,我想如果我遵循这些说明,我不会犯错误.如果我错了,请告诉我:)
我将尝试不使用自动释放,个人来说,通过使用自动释放,在某个自动释放池耗尽之前可能总会有一些冗余内存.我只会使用release,这可以确保我的应用程序随时使用最少的内存.
用我自己的话说,苹果说的另一件事是:每次我添加一个retain/alloc/copy,我都应该添加一个版本某处.
以下是我总结的所有场景:
在同一个函数中:分配一个对象,使用它并释放它
在类的init函数中,在类的dealloc函数中分配一个对象,释放该对象
当需要拥有一个指针时,应该在类的方法中保留一个输入指针(比如方法A),然后在类的dealloc函数中释放指针.
我发现在目标c 中使用retain的时间与在c/c ++ 中使用memcpy的时间相同,所以我将retain作为"内存有效副本"
如果输入保留指针要设置为成员指针变量,则应首先释放成员指针.因此,在情况下[3],ALLOC在初始化类的配对与释放在方法A,而保留在方法A配对与释放在的dealloc
返回指针作为返回值.老实说,当我使用c ++时,我从未做过这样的事情.如果要返回一个成员指针就可以了,因为有人会照顾它:
-(UIButton*) getTheButton() {
    return theButton;
}
Run Code Online (Sandbox Code Playgroud)
但是返回指向本地分配对象的指针真的很糟糕:
-(UIButton*) getTheButton() {
    UIButton* myButton = [[UIButton alloc] init];
    return myButton; //TERRIBLE!
} …Run Code Online (Sandbox Code Playgroud)我的.h文件中有以下代码:
@interface Utils : NSObject {
    NSString *dPath;
}    
@property(nonatomic, retain) NSString *dPath;
Run Code Online (Sandbox Code Playgroud)
在我的.m文件中:
    NSArray *documentPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
dPath = [[documentPaths objectAtIndex:0] stringByAppendingPathComponent:kDatabaseName];
[dPath retain]; 
Run Code Online (Sandbox Code Playgroud)
如果dPath已经定义为(非原子,保留),为什么还要保留 dPath?如果我不添加[dPath retain]; 我得到一些奇怪的,随机的错误,并且在其他函数中使用此变量时应用程序崩溃.我想这是因为某些自动释放,但我没有.
那么,什么是(非原子的,保留)做什么呢?是否真的有必要[dPath保留]; 或者我只是隐藏其他东西?
使用代码示例的简短问题:
NSLog(@"%i", [[[NSArray alloc] init] retainCount]);
NSLog(@"%i", [[[NSMutableArray alloc] init] retainCount]);
Run Code Online (Sandbox Code Playgroud)
输出:
2
1
Run Code Online (Sandbox Code Playgroud)
为什么NSArray和NSMutableArray中的retainCount不同?
在调用块之前/之后,retaincount始终是1.从apple block doc我们知道self应该保留.谁能知道为什么?
NSLog(@"Before block retain count: %d", [self retainCount]);    
void (^block)(void) = ^(void){
    UIImage* img = [UIImage imageNamed:@"hometown.png"];
    [self setImage:img];
    NSLog(@"After block retain count: %d", [self retainCount]);
};
block();
Run Code Online (Sandbox Code Playgroud) 我有500列数据集,我想按字母顺序重新排列所有变量.除了在set语句之前使用retain语句之外,我该怎么做呢?
我想写一个函数minimum来返回在调用之间发送给它的最小值.该函数可以接收任意数量的参数,所有参数都是0到100范围内的整数.发送给函数的参数列表的结尾用-1表示.
例如,如果我输入以下呼叫main:
minimum (90,78,5,20,-1);
minimum (70,40,2,-1);
minimum(40,30,-1);
Run Code Online (Sandbox Code Playgroud)
第一个呼叫将返回5,因为最小值90,78,5,20为5.第二个呼叫将返回2,因为最小值5,70,40,2为2第三个呼叫将返回2,因为最小值2,40,30的值是2.
因此,该函数minimum返回到目前为止发生的所有调用中发送给它的最小数字.
所以我创建了一个静态变量,调用它min来保留函数调用之间的最小值.
这是我得到的:
#include <stdio.h>
#include <stdarg.h>
int minimum(int cnt, ...)
{
   static int min;
   int cur_min,i;
   va_list lst;
   va_start(lst,cnt);
   cur_min = va_arg(lst,int);
   min = cur_min;
 printf("min is %d and cur min is %d \n", min, cur_min);
    for(i=0; i<cnt; i++)
    {
        if(cur_min != -1)
        {
            if(cur_min < min)
            {
                min = cur_min;
            }
           cur_min = va_arg(lst,int);
           printf("min is %d and cur min is %d \n" , …Run Code Online (Sandbox Code Playgroud) 这里有一些代码有两个数组(np和op),一个是另一个的副本
但是,当我修改副本时,原件也被修改了!看一看:
<script type="text/javascript">
var op=new Array(0, 0);
var np=op;
np[1]=2;
document.write(op+"<br>")
document.write(np)
</script>
Run Code Online (Sandbox Code Playgroud)
有没有办法保留原件并修改副本?
我有点理解保留的重要性.但并非如此.我看了很多谷歌试图理解,但我仍然没有.
现在我在一些代码(我正在进行iPhone开发),我认为我应该使用它们但不完全知道如何.
有人能给我一个快速而好的例子,说明如何以及为何使用它们?
谢谢!
XCode接受它.但是当我在内部设置属性时会保留应用(自从readonly以来没有setter,但是当我在类方法中初始化值时)?
此致,Apple92
retain ×10
objective-c ×5
ios ×2
iphone ×2
memory ×2
arrays ×1
autorelease ×1
block ×1
c ×1
cocoa ×1
javascript ×1
minimum ×1
nslog ×1
nsstring ×1
properties ×1
readonly ×1
sas ×1
self ×1
static ×1
variables ×1