Iphone MyObject对象是否可能;装垃圾?
有一种情况是,如果不显式地将本地CGFloat初始化为0,则会导致包含垃圾的变量:Iphone MyObject对象是否可能;装垃圾?,iphone,objective-c,ios,Iphone,Objective C,Ios,有一种情况是,如果不显式地将本地CGFloat初始化为0,则会导致包含垃圾的变量: -(void)foo { CGFloat aFloat; NSLog(@"float:%f", aFloat); aFloat = 70; } [self foo]; [self foo]; 输出: float:0 float:70 2012-08-06 06:52:36.123 test[15293:403] stackString='(null)', ivarString='(null
-(void)foo
{
CGFloat aFloat;
NSLog(@"float:%f", aFloat);
aFloat = 70;
}
[self foo];
[self foo];
输出:
float:0
float:70
2012-08-06 06:52:36.123 test[15293:403] stackString='(null)', ivarString='(null)'
2012-08-06 06:52:36.126 test[15293:403] stackString='Hello', ivarString='World'
所以它实际上应该两次都打印0,但是因为我没有显式地将浮点初始化为0,所以第二次它包含垃圾。我的问题是,这是否也适用于对象?这两个选项之间的局部变量是否存在差异:
1. NSObject *object;
2. NSObject *object = nil;
如果指针是ivar,则它最初为零。如果您在类的@interface部分声明了它,那么它就是一个ivar。如果指针是一个局部变量,您在方法中声明它,它将包含垃圾。最好的做法是总是立即分配任务
更新:正如omz在评论中指出的那样,如果您使用的是ARC,那么如果指针是局部变量,那么指针也将为零。如果指针是ivar,那么指针最初为零。如果您在类的@interface部分声明了它,那么它就是一个ivar。如果指针是一个局部变量,您在方法中声明它,它将包含垃圾。最好的做法是总是立即分配任务
更新:正如omz在评论中指出的那样,如果您使用的是ARC,那么如果指针是局部变量,那么指针也会被置零。是,同样适用;对象指针是一个变量,与float类似: 测试m:
#include <Foundation/Foundation.h>
@interface Foo : NSObject
{
NSString *ivarString;
}
- (void)foo;
- (void)test;
@end
@implementation Foo
- (void)foo
{
NSString *stackString;
NSLog(@"stackString='%@', ivarString='%@'", stackString, ivarString);
stackString = @"Hello";
ivarString = @"World";
}
- (void)test
{
[self foo];
[self foo];
}
@end
int main(int argc, const char **argv)
{
@autoreleasepool
{
Foo *foo = [[[Foo alloc] init] autorelease];
[foo test];
}
return 0;
}
请注意,此测试项目使用MRR,而不是ARC。是,同样适用;对象指针是一个变量,与float类似: 测试m:
#include <Foundation/Foundation.h>
@interface Foo : NSObject
{
NSString *ivarString;
}
- (void)foo;
- (void)test;
@end
@implementation Foo
- (void)foo
{
NSString *stackString;
NSLog(@"stackString='%@', ivarString='%@'", stackString, ivarString);
stackString = @"Hello";
ivarString = @"World";
}
- (void)test
{
[self foo];
[self foo];
}
@end
int main(int argc, const char **argv)
{
@autoreleasepool
{
Foo *foo = [[[Foo alloc] init] autorelease];
[foo test];
}
return 0;
}
请注意,此测试项目使用MRR,而不是ARC
它第二次装的是垃圾
其实里面没有垃圾。它包含以前写入内存中该位置的相同值。恰好堆栈没有机会被任何新值覆盖,所以当您第二次调用foo时,浮动变量被映射到同一位置
对于更具体的描述,我强烈推荐其中一种
它第二次装的是垃圾
其实里面没有垃圾。它包含以前写入内存中该位置的相同值。恰好堆栈没有机会被任何新值覆盖,所以当您第二次调用foo时,浮动变量被映射到同一位置
对于更具体的描述,我强烈推荐其中一个。补充:如果使用ARC,所有对象都将初始化为nil,而不仅仅是ivar。这对ARC是如何工作的?如果它包含垃圾,它将尝试释放垃圾;NSLog@%@,str;将实际记录null而不是潜在崩溃。@感谢您指出这一点,我已将其添加到我的答案中。此外:如果使用ARC,则所有对象都将初始化为nil,而不仅仅是ivars。这对ARC是如何工作的?如果它包含垃圾,它将尝试释放垃圾;NSLog@%@,str;将实际记录为null,而不是可能崩溃。@感谢您指出这一点,我已将其添加到我的答案中。应该这样吗NSLog@float:%f,漂浮着;?应该是这样吗NSLog@float:%f,漂浮着;?