我刚看过std::allocator.在我看来,使用它而不是使用new和更复杂delete.
随着allocator我们必须明确分配堆内存,构建它,消灭它,然后终于解除分配内存.那它为什么会被创造出来?
在哪些情况下可以使用它何时应该使用而不是新的和删除?
从论坛讨论看,似乎最大的区别是性能因素,allocWithZone:将从特定的内存区域分配内存,从而降低交换成本.
在实践中,几乎没有机会使用allocWithZone:,任何人都可以给出一个简单的例子来说明使用allocWithZone的情况:
谢谢,
因为我读过realloc将作为malloc,如果指向的大小是0,我使用它没有malloc(),前提是指针是静态的,全局的,或者如果是自动的话显式设置为NULL.
但是,我注意到很多程序员试图设置它或将其设置为malloc(1).需要它吗?
快速问题......我明白所有属性在Objective-C中以nil开头,并且向nil发送消息不起作用,因此必须使用[[Class alloc] init]初始化; 在向新创建的属性发送消息之前.但是,如果我不向此属性发送消息或者如果我使用self.property = some设置属性呢?在这些情况下我是否还需要分配init?此外,UI属性也是以nil开头的,例如您从故事板中拖出的UILabel属性?这些需要alloc init吗?
感谢所有回答的人
initialization properties objective-c alloc lazy-initialization
一些小步骤开始围绕Swift缠头.我基本上移植了一个旧类,它只是找到一个名称的匹配图标并返回相应的UIImage.事情的Swift部分似乎正在运行,看起来(几乎)像这样:
@objc class ImageHandler{
func iconForData(data: MyData) -> UIImage{
let imagesAndNames = [
"1": "tree.png",
"2": "car.png",
"3": "house.png",
"7": "boat.png",
]
var imageName: String? = imagesAndNames[data.imageName]
if !imageName{
imageName = "placeholder.png"
}
let icon = UIImage(named: imageName)
return icon
}
}
Run Code Online (Sandbox Code Playgroud)
上面没有任何警告.然而,我的旧Objective-C类要求在swift类上使用alloc方法.
ImageHandler *imageHandler = [ImageHandler alloc] init];
Run Code Online (Sandbox Code Playgroud)
返回错误"没有选择器'alloc'的已知类方法,我猜这是真的,但是如何逃避这个?我是否必须以我的swift-class NSObject为基础来避免这种情况?
注意:我对Objective-C比较新,我来自Java和PHP.
有人可以向我解释为什么我总是要先分配然后初始化一个实例?
不能在这样的init方法中完成:
+ (MyClass*)init {
MyClass *instance = [MyClass alloc];
[instance setFoo:@"bla"];
return instance;
}
+ (MyClass*)initWithString:(NSString*)text {
MyClass *instance = [MyClass init];
[instance setFoo:text];
return instance;
}
...
Run Code Online (Sandbox Code Playgroud)
这只是旧C日的残骸还是有些东西我没有看到?
我知道这不是问题,因为我总是可以调用alloc和init,但由于它有点乏味,我想至少知道我为什么要这样做.
到目前为止,我喜欢语言的表达能力,但这是我想要完全理解的,以便考虑Objective-C的方式.
谢谢!
所述的StackOverflow问题"其定义一个缓存变量时使用静态关键字在目标c"的引用从实施例4 Xcode的TableViewSuite的代码限定static NSDateFormatter和呼叫alloc但永远不会调用release.
不static应该发布变量吗?如果是,代码应该在何处发布?如果不是,为什么不呢?
当我创建指向某个结构的指针时,我是否必须将其设置为NULL,然后分配它然后使用它?为什么?
我收到了这个警告
"自动引用计数问题:将保留对象分配给unsafe_unretained变量;对象将在分配后释放"
这是代码
.H
@interface myObject : NSObject
{
}
@property (assign) id progressEnergy;
@end
Run Code Online (Sandbox Code Playgroud)
.M
@implementation myObject
@synthesize progressEnergy;
-(id)init
{
if ( ( self = [super init] ) )
{
progressEnergy = [[progress alloc] init]; //warning appear on this line
}
return self;
}
@end
Run Code Online (Sandbox Code Playgroud)
我已经尝试过了
@property (assign) progress* progressEnergy;
Run Code Online (Sandbox Code Playgroud)
但没有运气
你能帮我弄清楚出了什么问题吗?